2013-11-01 3 views
-2

Рассмотрим следующий случай,Поиск дубликатов на основе состояния в SQL

No.   Name Tag 
1   ABC  X1 
2   DEF  x1 
3   GHI  x1 
4   JKL  x2 
5   MNO  x3 
6   PQR  x4 
7   PQR  x4 
8   STU  x4 
9   VWX  X5 
10   YZI  x5 

Теперь мне нужно найти дубликаты, имеющие такое же имя и тег.

В идеале результат должен быть

No.   Name Tag 
6   PQR  x4 
7   PQR  x4 
+1

Укажите, пожалуйста, вашу базу данных, такую ​​как MS Sql server, MySql, Oracle и т. Д. – TechDo

ответ

3

Это будет работать на большинстве СУБД, так как вы не указали один.

SELECT * 
FROM TableName a 
WHERE EXISTS 
     (
      SELECT 1 
      FROM TableName b 
      WHERE a.name = b.Name AND 
        a.Tag = b.Tag 
      GROUP BY Name, Tag 
      HAVING COUNT(*) > 1 
     ) 
+0

Предполагая, что № является первичным ключом (как представляется,), GROUP/HAVING можно заменить простым добавлением. [No.] <> b. [№] к предложению WHERE. – richardtallent

0

Пожалуйста, попробуйте:

SELECT b.* 
FROM (
    SELECT Name, Tag 
    FROM YourTable 
    GROUP BY Name, Tag 
    HAVING COUNT(*) > 1 
)x inner join YourTable b on x.Name=b.Name and x.Tag=b.Tag 
+1

Это не сработает, оно не вернет «Нет». колонка. – richardtallent

+0

Да, @richardtallent, вы правильно, я отредактировал ответ. – TechDo

1

В MySQL вы можете использовать хитрую пару where Пункта так:

SELECT * FROM t 
WHERE (name, tag) IN (
    SELECT name, tag FROM t 
    GROUP BY name, tag 
    HAVING COUNT(*) > 1 
) 

скрипку here.

Смежные вопросы