SQL Server: найдите дубликаты и для каждой из них напечатайте обе строки - PullRequest
0 голосов
/ 02 сентября 2018

Существует бесконечное множество примеров переполнения стека о том, как найти повторяющиеся строки в SQL Server. Но моя цель:

  1. Поиск дубликатов
  2. Распечатайте оба, а не только один

Например, я использую этот запрос, чтобы найти в моей базе данных все коммерческие объекты с одинаковыми 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

Но этот запрос возвращает только одну строку - я хочу видеть их обоих.

enter image description here

Ответы [ 4 ]

0 голосов
/ 02 сентября 2018

Другой метод, с перекрестным применением

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 голосов
/ 02 сентября 2018

Проще говоря, вы можете попробовать заменить row_number на count следующим образом:

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
0 голосов
/ 02 сентября 2018

Другой метод, с существующим, но с другим идентификатором, Лучшая производительность, чем при использовании группы:

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
)
0 голосов
/ 02 сентября 2018

Вы можете попытаться написать подзапрос, чтобы получить группу 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 )
...