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
→ Ссылка