SQL. Поставить признак, если значения строк совпадают
Допустим, некоторые ID в табличке совпадают, но при этом значения других столбцов разные, можно ли технически как-то через IF в новом столбце проставить признак "1", если совпадение есть и "0", если его нет? Всё это в запросе.
Ответы (2 шт):
Автор решения: pegoopik
→ Ссылка
Можно и с подзапросом, как предлагали в комментарии, но это будет приемлемо работать только на небольшом количестве строк или если по ID есть индекс. Например так:
SELECT CASE
WHEN (
SELECT COUNT(*) FROM your_table as T2
WHERE T1.ID = T2.ID
) > 1
THEN 1 ELSE 0 END as isDuplicated, T1.*
FROM your_table as T1
Можно ещё без повторного обращения к таблице с помощью оконных функций:
SELECT CASE
WHEN COUNT(*)OVER(PARTITION BY ID) > 1
THEN 1 ELSE 0 END as isDuplicated, your_table.*
FROM your_table
На всякий случай проверьте оба варианта. Какой быстрее зависит от многих факторов.
Возможно вам достаточно/удобней будет получить список проблемных ID, для этого можно выполнить такой простой запрос:
SELECT ID, COUNT(*) as duplicatedCount
FROM your_table
GROUP BY ID HAVING COUNT(*) > 1
Автор решения: Vitaliy Zlobin
→ Ссылка
SELECT Id, CAST(COUNT(*) OVER(PARTITION BY Id) - 1 AS BIT) AS HasDuplicate
FROM TableName