#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