SQL:不同数量的数据

时间:2014-08-18 13:43:32

标签: sql

我手头有两步任务:首先,应该执行某个连接:

  Select *
  FROM [my_table2]b
  left join [my_table3]c
  on (b.CUSTOMER_PK=c.CUSTOMER_PK)
  where c.CUSTOMER_PK is null

完美无缺,并为我提供了下一步所需的2985行(以验证所有收到的数据是否出现在另一个表中:

SELECT  *
FROM [my_table1]a 
where a.customer_id in (Select b.customer_id 
FROM [my_table2]b
left join [my_table3]c
on (b.CUSTOMER_PK=c.CUSTOMER_PK)
where c.CUSTOMER_PK is null)

出于某种原因,它给了我更多的行 - 2996(当DISTINCT与所有列名一起使用时,结果相同)。但是,当我试图找出 - 通过EXCEPT(不支持MINUS)的额外11行是什么(我只需要在所有表中接收一个相同的数据类型的列 - decimal(9,0) ),我没有结果。知道出了什么问题吗? 这是第三个查询:

Select customer_id
FROM [my_table1]a 
where a.customer_id in (Select b.customer_id 
FROM [my_table2]b
left join [my_table3]c
on (b.CUSTOMER_PK=c.CUSTOMER_PK)
where c.CUSTOMER_PK is null)
EXCEPT
Select customer_id
FROM [my_table2]b
left join [my_table3]c
on (b.CUSTOMER_PK=c.CUSTOMER_PK)
where c.CUSTOMER_PK is null

谢谢!

2 个答案:

答案 0 :(得分:1)

第一个选择中的一个或多个customer_id包含多个记录,customer_id中有[my_table1]个。{/ p>

要找出哪些ID是重复的,您可以使用类似这样的内容

SELECT a.customer_id, count(*)
FROM [my_table1]a 
left join [my_table2]b on (a.customer_id = b.customer_id)
left join [my_table3]c on (b.CUSTOMER_PK = c.CUSTOMER_PK)
where c.CUSTOMER_PK is null
group by a.customer_id
having count(*) > 1

答案 1 :(得分:0)

您的问题可能是单个客户在第一个表my_table1中有多行。您可以通过以下方式寻找此类客户:

select a.customer_id, count(*) as cnt
from my_table1 a
group by a.customer_id
having count(*) > 1
order by cnt desc;

当然,这适用于所有值,而不仅仅是匹配的值。这可能会让您了解问题所在。否则,使用相同的方法,但使用in子句。

问题是bc表中重复。 in子句在输出时不会产生重复。