SQL-запрос, который находит повторяющиеся данные в одном столбце с разными данными во втором столбце

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

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

 ID   Date   Data
A    D1     123
A    D1     456
A    D2     123
 

То, что я ищу, — это оператор select, который будет извлекать все строки, где идентификатор и Дата повторяются как пара, но данные не совпадают. В этом случае он вернет две верхние строки, потому что идентификатор A и Дата D1 повторяются как пара, но данные разные. Третья строка не будет возвращена, поскольку комбинация идентификатора и даты не повторяется.

Комментарии:

1. что делать, если есть три строки с этой комбинацией идентификатора и даты?

2. Будет возвращено любое количество повторений

Ответ №1:

Сделать это можно несколькими способами. Вот один из вариантов использования exists :

 select *
from yourtable t
where exists (
    select 1
    from yourtable t2
    where t.id = t2.id and t.date = t2.date and t.data <> t2.data
)
 

Комментарии:

1. Можете ли вы объяснить, что делает «выбрать 1»?

2. @Deena — на самом деле ничего, просто возвращает 1 или null… exists оператор проверяет where , соответствуют ли критерии. В этом случае вы сравниваете, что идентификаторы равны, а даты равны, но данные разные. Другие методы, включая использование not in или использование самосоединений. Я предпочитаю это и считаю, что оно должно иметь наилучшую производительность.

3. Спасибо, я поиграю с этим и свяжусь с вами

Ответ №2:

 SELECT  d.Id ,
        d.Date ,
        d.Data
FROM    YourTable d
        INNER JOIN ( SELECT Id ,
                            Date
                     FROM   YourTable
                     GROUP BY Id ,
                            Date
                     HAVING COUNT(*) > 1
                   ) a ON a.Id = d.Id