【问题标题】:Subqueries on subqueries子查询上的子查询
【发布时间】:2013-06-14 09:26:19
【问题描述】:

我正在尝试创建一个选择语句

我需要从一个表中收集一条与另一个表中使用的代码相同的记录。

更好的说法是,客户从下拉列表中选择一个城市和该城市的类别。 当客户端点击下一步时,会显示该城市中符合该类别的各个地方。 但我不知道哪里出错了。

现在当客户选择一个城市时,每个城市都会读取两条记录,一个正确的城市代码和一个以“bx”为首字母的邮箱代码

在我的第一个查询中,为了消除重复,我说

select c.[Description] from city c 
where c.Provincecode like 'EC' and 
      c.citycode in (select c.citycode from City c 
                     where SUBSTRING(c.citycode,0,3) not like 'bx')

这给了我一个城市名称。

但是现在,如果客户选择了,例如,只收现金的地方, 结果中应该只显示一条记录

但尽我所能,我无法获得正确的语法

我试过了:

select c.[Description] from city c 
where c.Provincecode like 'EC' and 
      c.citycode in (select c.citycode from City c 
                     where SUBSTRING(c.citycode,0,3) not like 'bx') 
      and exists (select * from Customers cu 
                  where cu.Category like 'SC' and cu.Province like 'EC')

但这带来了比预期更多的结果

这是使用 access 数据库完成的,但我使用 SQL 进行编码,我将其重新写入 access。这不是问题

所以如果有人可以提供 SQL 答案,我可以从那里完成剩下的工作

我不确定我是否应该加入。 我试过了

select * from 
(select c.[Description] from city c 
 where c.Provincecode like 'EC' and 
       c.citycode in (select c.citycode from City c 
                      where SUBSTRING(c.citycode,0,3) not like 'bx')) x 
join Customers on  province=city.provincecode where Category like 'SC'

但我收到了无法绑定多部分标识符的错误


编辑

这是新的查询

select * 
from 
    (
        select c.* 
        from city c 
        where c.Provincecode like 'EC' 
            and c.citycode in
                (
                    select c.citycode 
                    from City c 
                    where SUBSTRING(c.citycode,0,3) not like 'bx'
                )
    ) x 
    join 
    Customers  
        on  province=x.Provincecode 
where Category like 'SC'

返回的是

如您所见,以 C Strydom 作为客户的结果太多了,但所有城市都在那里

对于这个特定的例子,应该只显示一条记录,第二条

【问题讨论】:

  • 在您的最后一个查询中,JOIN 条件包括city.provincecode,但city 不起作用:该JOIN 位于Customers 表和您别名为x 的派生表之间。
  • 好的。我将选择 c.{Description] 更改为 c.*,表示 x.Provincecode(源自表格)并且有点工作。 distinct 会给我一个,没有,我得到 12 个结果。
  • 如何从那里改进它? (抱歉之前的评论拼写错误)
  • 如果没有一些具有代表性的样本数据或其他附加信息,这很难说。听起来您希望返回一条记录,并且(我认为)您说添加 DISTINCT 返回了一条记录,所以它不是正确的吗?
  • 没有。如果我不使用 distinct,从上面的示例中我会得到 12 条记录。只有一个是正确的。但是在某个地方,一个子句正在返回所有记录。使用 distinct 当然会消除额外的东西,但为了将来的使用,我想看看是什么导致了额外的东西。我需要将like子句放在某个地方,只是找不到地方

标签: sql database ms-access subquery


【解决方案1】:

问题是不完整的 JOIN(有关详细信息,请参阅问题 cmets)。有效的查询是

select * 
from 
    (
        select c.* 
        from city c 
        where c.Provincecode like 'EC' 
            and c.citycode in
                (
                    select c.citycode 
                    from City c 
                    where SUBSTRING(c.citycode,0,3) not like 'bx'
                )
    ) x 
    INNER JOIN 
    Customers 
        ON Customers.province=x.Provincecode 
            AND Customers.city=x.Citycode 
where Category like 'SC'

【讨论】:

    【解决方案2】:

    虽然我不喜欢使用 SELECT *,但你知道更多你想要的实际列,我把它留给你。查询应该很简单,因为您主要查看特定省份代码的“City”表,但不以“bx”开头。只需在 where 子句中添加它......您可以测试有关记录的多项内容,而无需根据其他一些标准加入自身。一旦你有了它,就可以简单地连接到你所限制的类别的客户表。

    select *
       from 
          city c 
             JOIN Customers CU
                on c.ProvinceCode = CU.Province
               AND CU.Category like 'SC'
       where 
              c.ProvinceCode like 'EC' 
          and NOT substr( c.CityCode,0,3 ) = 'bx'
    

    现在,每个客户的多条记录问题。如果您加入的只是客户表的省代码,您将获得笛卡尔结果...但是如果您加入客户的 ProvinceCode AND City,您将只获得匹配的单个结果...但我们没有客户表详细信息来确认该列关系。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-30
      相关资源
      最近更新 更多