Stack Overflow上有关于如何在SQL Server中查找重复行的无数示例。但我的目标是:
例如,我正在使用此查询在我的数据库中查找具有相同Street_Number
,Street
和City
的所有商业:
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
但是这个查询只返回一行 - 我想看到它们两个。
简单地说,您可以尝试将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
你可以尝试写一个子查询来获得COUNT
,Street
,Street_Number
的City
组,其数量大于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 )
其他方法,交叉申请
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
其他方法,存在但具有不同的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
)