存在返回太多行

时间:2014-04-04 06:36:35

标签: sql-server

如果我使用“CS.cust_id in”中的行,我会得到正确的结果(两项)。但是,如果我用“where exists”替换它,我会得到CS表中的每个cust_id,这是完全错误的。我究竟做错了什么? (使用SQLS 2008 R2)。

select CS.cust_id, CS.cust_name_last
from bkorders.customers CS
-->where CS.cust_id in
-->where exists
(
  select OH.cust_id
  from bkorders.order_headers OH
  where (year(OH.order_date) = year(getdate())-1 and month(OH.order_date) = 10)   
  and
  OH.cust_id in
  (
    select OH.cust_id
    from bkorders.order_headers OH
    where (year(OH.order_date) = year(getdate())-1 and month(OH.order_date) = 11)
  )
    and
    OH.cust_id in
    (
      select OH.cust_id
      from bkorders.order_headers OH
      where (year(OH.order_date) = year(getdate())-1 and month(OH.order_date) = 12)
    )
)

3 个答案:

答案 0 :(得分:1)

关联存在的子查询:

select CS.cust_id, CS.cust_name_last
from bkorders.customers CS
where exists
(
  select OH.cust_id
  from bkorders.order_headers OH
  where (year(OH.order_date) = year(getdate())-1 and month(OH.order_date) = 10)  
  and  CS.cust_id = OH.cust_id --> this
  and
  OH.cust_id in
  (
    select OH.cust_id
    from bkorders.order_headers OH
    where (year(OH.order_date) = year(getdate())-1 and month(OH.order_date) = 11)
  )
    and
    OH.cust_id in
    (
      select OH.cust_id
      from bkorders.order_headers OH
      where (year(OH.order_date) = year(getdate())-1 and month(OH.order_date) = 12)
    )
)

答案 1 :(得分:0)

您是否有特定原因要使用WHERE EXISTS而不是WHERE ... IN

请记住,只要EXISTS之后的子查询返回至少一条记录,WHERE EXISTS将返回任何记录,因为子查询与主查询之间没有关联(这解释了为什么你从bkorders获得所有记录。在这种情况下的客户)。另一方面,WHERE CS.cust_id IN仅将结果限制为那些cust_id属于从子查询返回的客户。

答案 2 :(得分:0)

其中CS.cust_id 中有CS.cust_id的过滤条件 和存在没有任何过滤条件..