SQL查询重复记录

6
我正在尝试在SQL Server中编写查询,以通过客户ID查找每个客户是否存在多行。请告诉我。
以下是表结构:
Customer table
-----------------------------------------
orderID          CustName      CustomerID
---------------------------------------
100               test           123456    
101               test           123456

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

5
如果您有更改设计的权限,请注意您的问题源于客户表中存在“重复组”(请谷歌“数据库规范化”)。更明智的结构方式,假设每个订单只由一个客户制作,则应将CustomerID放在Order表中,而不是在客户表中放置OrderID。 - grossvogel
3个回答

17
你可以使用一个 GROUP BY 查询来实现这个目的:
select CustomerID, count(*) as NumDuplicates
from Customer
group by CustomerID
having count(*) > 1

同时,订单表中有一个成功标志。我想通过顾客ID获取所有订单表中成功标志为1的行。 - nav100
@nav100:您应该更新问题并添加这个新要求。它会改变查询。 - FrustratedWithFormsDesigner

5

查看每个客户的数量:

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

您可以使用 having 子句仅限于重复项:
SELECT COUNT(*), CustName, CustomerID
from Customer
Group by CustName, CustomerID
having count(*) > 1

更新

获取已成功订单的方法:

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; 

这是我想出来的查询。但它由两个查询组成。从客户中选择顾客ID选择*从订单中,其中订单ID在 (选择OrderId从客户中,其中customerID = 123456) 并且成功= 1 - nav100

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

@OMG Ponies:实际上,在SQL Server中,这是计算常数1而不是序数... 另外,SUM(1)会做什么? - gbn
@OMG Ponies:这里使用1作为一个常量。 - Pablo Santa Cruz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接