SQL Server:查找重复文件,并为每个文件打印两行

问题描述 投票:1回答:4

Stack Overflow上有关于如何在SQL Server中查找重复行的无数示例。但我的目标是:

  1. 查找重复项
  2. 打印它们,而不仅仅是其中一个

例如,我正在使用此查询在我的数据库中查找具有相同Street_NumberStreetCity的所有商业:

WITH CTE AS
(
    SELECT 
        ROW_NUMBER() OVER (PARTITION BY Street, Street_Number, City ORDER BY Street, Street_Number, City DESC) AS Counting,
        *   
    FROM 
        GoogleDetails 
)
SELECT * 
FROM CTE 
WHERE Counting > 1
ORDER BY Street_Number

但是这个查询只返回一行 - 我想看到它们两个。

enter image description here

sql sql-server tsql duplicates common-table-expression
4个回答
0
投票

简单地说,您可以尝试将row_number替换为如下计数:

WITH CTE AS
(
    SELECT 
        Count(*) OVER (PARTITION BY Street, Street_Number, City) AS Counting,
        *   
    FROM 
        GoogleDetails 
)
SELECT * 
FROM CTE 
WHERE Counting > 1
ORDER BY Street_Number

2
投票

你可以尝试写一个子查询来获得COUNTStreetStreet_NumberCity组,其数量大于1,然后自我加入得到你期望的行。

SELECT     t2.* 
FROM       ( 
                    SELECT   street, 
                             street_number, 
                             city 
                    FROM     googledetails 
                    GROUP BY street, 
                             street_number, 
                             city 
                    HAVING   Count(*) > 1 ) t1 
INNER JOIN googledetails t2 
ON         t1.street = t2.street 
AND        t1.street_number = t2.street_number
AND        t1.city = t2.city

或者你可以尝试使用EXISTS制作它。

SELECT t2.* 
FROM   googledetails t2 
WHERE  EXISTS 
       ( 
                SELECT   1 
                FROM     googledetails t1 
                WHERE    t1.street = t2.street 
                AND      t1.street_number = t2.street_number
                AND      t1.city = t2.city 
                GROUP BY t1.street, 
                         t1.street_number, 
                         t1.city 
                HAVING   count(*) > 1 )

0
投票

其他方法,交叉申请

SELECT f0.* 
FROM   googledetails f0 
cross apply
(
    select count(*) Counter 
    from googledetails f1 
    where f1.street = f0.street and f1.street_number = f0.street_number and f1.city = f0.city

) f2
where f2.Counter>1

0
投票

其他方法,存在但具有不同的ID,比使用组的性能更好:

SELECT f0.* 
FROM   googledetails f0 
WHERE  EXISTS 
(
    select * from googledetails f1 
    where f1.ID<>f0.ID and f1.street = f0.street
    and f1.street_number = f0.street_number and f1.city = f0.city
)
© www.soinside.com 2019 - 2024. All rights reserved.