2016-09-22 2 views
2

Я пытаюсь выбрать все дублированные (удаление отдельной записи) запись таблицы, результат объединения.SQL show duplicates после присоединения

Я пытаюсь сделать это с:

SELECT items.id, b.title FROM b WHERE b.title IN (
SELECT b.title FROM b LIMIT 20 GROUP BY b.title HAVING COUNT(*)>1 
) INNER JOIN items USING (number) 

Примечание: number является индекс общей для «элементов» и «B» таблиц, используемых для соединения.

Но очевидно, что это не сработает. Я пытаюсь понять, как получить дубликаты и вернуть результат соединения.

Пример вывода должен быть:

id | title 
----|---- 
001 | House 
002 | House 
005 | Tree 
010 | Tree 
006 | Car 
007 | Car 
+0

Какие СУБД вы используете? – EoinS

+1

Почему именно LIMIT? – jarlh

+0

MySql и LIMIT доступны только для отладки, 20 - это хорошее количество, чтобы получить некоторые дубликаты для тестирования. – GiuseppeP

ответ

2

COUNT(*) Использование в подзапрос несет накладные расходы. Я хотел бы предложить:

SELECT i.id, b.title 
FROM b JOIN 
    items i 
    USING (number) 
WHERE EXISTS (SELECT 1 
       FROM b b2 
       WHERE b2.title = b.title AND b2.id <> b.id 
      ); 

Это предположить, предположим, что b имеет уникальный идентификатор на каждой строке, которая используется в подзапрос. Этот запрос может использовать индекс на b(title, id).

+0

Спасибо большое, первая часть была ясна, было немного сложно понять вторую часть , Это очень хорошо объясняло, как выбирать правильные элементы – GiuseppeP

0

Я совершил нечто подобное несколько раз, используя запрос, подобный этому.

SELECT id 
     ,title 
    FROM some_table AS T1 
WHERE (SELECT COUNT(1) 
      FROM some_table AS T2 
     WHERE T1.title = T2.title) > 1 
1

Вы можете сделать это следующим образом:

SELECT id, title 
FROM b INNER JOIN items USING number 
WHERE title IN 
    (SELECT title 
    FROM b 
    GROUP BY title 
    HAVING COUNT(*) > 1)