当前位置:  开发笔记 > 编程语言 > 正文

SQL Server - 获取具有不同查询的重复行

如何解决《SQLServer-获取具有不同查询的重复行》经验,为你挑选了1个好方法。

我正在尝试为每个客户计算子记录(地址).我有2个查询,我想知道它们是否相同:

SELECT 
    a.AddressId,  c.CustomerID, COUNT(*) AS NumDuplicates 
FROM 
    Customers C
INNER JOIN 
    Addresses a ON c.AddressID = a.AddressID 
GROUP BY 
    c.CustomerID, a.AddressId 
ORDER BY 
    NumDuplicates DESC


SELECT 
    c.CustomerID,
    (SELECT COUNT(*) 
     FROM Addresses a 
     WHERE a.AddressID = c.AddressID) AS AddressCount
FROM 
    Customers c 
ORDER BY 
    AddressCount desc

如果他们不是,那有什么区别?如果它们更有效率?



1> Gordon Linof..:

这两个查询是不同的,因为第一个查询只返回在地址表中至少有一个匹配的客户.第二个返回所有客户,即使那些没有匹配且具有AddressIdNULL的客户.

等效的第一个查询是:

SELECT c.CustomerID, COUNT(a.AddressId) AS NumDuplicates
FROM Customers C LEFT JOIN
     Addresses a
     ON c.AddressID = a.AddressID 
GROUP BY c.CustomerID
ORDER BY NumDuplicates DESC;

至于性能,你应该尝试一下.有两个原因可能更快.第二个避免了必须进行聚合,但确实有一个相关的子查询.但是,SQL Server有一些加速连接和聚合的技巧.我猜想相关的子查询版本更快,但我的数据和服务器可能是错的.


是.请注意,在Gordon的回答中,连接是左连接,而不是内连接.如果你使用*在计数,它将返回1为没有地址的客户,但如果您使用AddressId返回0,因为计忽略空值.
@Eitan,是的.`COUNT(*)`返回组中的行数.`COUNT(a.AddressId)`返回`a.AddressId`不是'NULL`的行数.在这种特殊情况下,对于Customer连接到Address的那些行,`a.AddressId`将非空.没有地址的客户在结果中表示,因为使用外部联接而不是内部联接.
推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有