@nsuvorov
Менеджер

Как сделать в MSSQL поиск дубликатов в одной из колонок, при условии совпадения по другой колонке и отсутствия дубликатов в третьей?

Коллеги, всем привет!

Есть задачка не из тривиальных.
Дана таблица:
id | project_id | sum_1 | sum_2

Задача:
Найти все записи, которые соответствуют всем следующим условиям:
  1. Поле project_id совпадает и в рамках одного project_id:
  2. Поле sum_2 дублируется 1 и более раз
  3. Поле sum_1 НЕ дублируется


Вывести такие записи целиком, то есть:
id | project_id | sum_1 | sum_2

Бьюсь над задачей уже четыре часа, не могу сделать ничего лучше курсора с построчными запросами, но это совсем не оптимальный способ.
  • Вопрос задан
  • 554 просмотра
Пригласить эксперта
Ответы на вопрос 2
@jimquery
Попробуй такой вариант. У меня доступа нет к твоей таблице и бд, поэтому смог проверить только с первыми двумя условиями:
SELECT id, project_id, sum_1, sum_2
FROM [mytable] as tbl
WHERE 
sum_2 IN (
SELECT sum_2
 FROM [mytable]
 WHERE project_id = tbl.project_id
 GROUP BY  project_id, sum_2
HAVING count(sum_2) > 1)
AND project_id IN (
    SELECT project_id
    FROM [mytable]
    GROUP BY  project_id, sum_2
    HAVING count(sum_2) > 1)


По идее такой вариант должен быть рабочим:
SELECT id, project_id, sum_1, sum_2
FROM [mytable] as tbl
WHERE 
sum_1 IN (
SELECT sum_1
 FROM [mytable]
 WHERE project_id = tbl.project_id
 GROUP BY  project_id, sum_1
HAVING count(sum_1) < 2)
sum_2 IN (
SELECT sum_2
 FROM [mytable]
 WHERE project_id = tbl.project_id
 GROUP BY  project_id, sum_2
HAVING count(sum_2) > 1)
AND project_id IN (
    SELECT project_id
    FROM [mytable]
    GROUP BY  project_id, sum_2
    HAVING count(sum_2) > 1)
AND project_id IN (
    SELECT project_id
    FROM [mytable]
    GROUP BY  project_id, sum_1
    HAVING count(sum_1) < 2)


Ещё нужно учитывать, что код не оптимизированный для выполнения на рабочем сервере ввиду использования подзапросов.
Ответ написан
Комментировать
k1lex
@k1lex
Программист торг. сети. C# (WPF, WinForms), T-SQL
select 
t1.id ,  t1.project_id ,  t1.sum_1 ,  t1.sum_2
from table t1
inner join 
( select project_id , COUNT(sum_1) ac CT from  table group by project_id ) t2 ON t1.project_id=t2.project_id  and t2.CT>1
inner join 
( select project_id , COUNT(sum_2) ac CT from  table group by project_id ) t3 ON t1.project_id=t3.project_id  and t3.CT=1
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы