2010-06-30 181 views
4

我正试图在SQL服务器中编写一个查询,以查明每个客户的customerID是否有多行。 请让我知道。带有重复记录的SQL查询

这里是表结构

Customer table 
----------------------------------------- 
orderID   CustName  CustomerID 
--------------------------------------- 
100    test   123456  
101    test   123456 

Orders table 
------------------------------------ 
pID    OrderID 
----------------------------------- 
1     100   
2     101 
+5

如果你在一个地方是改变设计,请注意你的问题来源于顾客表中存在的'重复组'(谷歌'数据库标准化')。假设每个订单仅由一个客户完成,一个更明智的方法是将CustomerID放入Order表中,而不是Customer表中的OrderID。 – grossvogel 2010-06-30 18:31:23

回答

14

您可以使用GROUP BY查询来实现这一目标:

select CustomerID, count(*) as NumDuplicates 
from Customer 
group by CustomerID 
having count(*) > 1 
+0

订单表中还有一个成功标志。我想通过订单表成功标志为1的customerID获取所有行。 – nav100 2010-06-30 18:35:11

+0

@ nav100:您应该更新问题并添加此新要求。它改变了查询。 – FrustratedWithFormsDesigner 2010-06-30 18:53:12

0
select CustomerID, count(1) 
    from Customer 
group by CustomerID 
having count(1) > 1 
+0

@OMG Ponies:实际上,这是计数常数1不是序数......(至少在SQL Server中)。另外,SUM(1)会做什么? – gbn 2010-06-30 18:31:53

+0

@OMG小马:1在这里用作常量。 – 2010-06-30 18:33:33

+0

对不起,以为这是序号。我总是使用列或* ... – 2010-06-30 18:46:48

4

要看看有多少每个客户的您有:

SELECT COUNT(*), CustName, CustomerID 
from Customer 
Group by CustName, CustomerID 

您可以使用having子句限制只是重复:

SELECT COUNT(*), CustName, CustomerID 
from Customer 
Group by CustName, CustomerID 
having count(*) > 1 

UPDATE

要获得那些成功的订单:

select count(*), CustName, CustomerID 
from(
    SELECT CustName, CustomerID 
    from Customer, orders 
    where customer.orderID = orders.orderID 
    and orders.success = 1) subquery 
group by subquery.CustName, subquery.CustomerID 
having count(*) > 1; 
+0

这是我想出的查询。但它是2个查询。 从客户选择客户ID select * from订单ID (从客户选择OrderId,其中customerID = 123456) 且成功= 1 – nav100 2010-06-30 18:44:41