SQL-запрос: выбрать дубли по двум таблицам

Коля Дубр
На сайте с 02.03.2005
Offline
153
1325

Есть 2 таблицы:

offer: id, firm_id

offer_to_section: offer_id, classifier_id, section_id

Соответственно, offer_to_section.offer_id ссылается на offer.id, для одного offer может быть несколько записей offer_to_section.

Задача: составить SQL-запрос, показывающий пары offer.id - offer.id, для которых совпадают firm_id и все связанные записи из offer_to_section, т.е. для обеих строк есть равное число соответствующих строк в offer_to_section, у которых совпадают и classifier_id, и section_id. Например, пусть у нас есть такие данные:

offer


id firm_id
1 5
2 5
3 6
4 6

offer_to_section


offer_id section_id classifier_id
1 10 2
2 15 4
3 10 2
4 10 2

В результате отработки хотим получить:


original_id double_id
3 4

Т.к. для offer#3 и offer#4 совпадает и firm_id, и оба свойства из offer_to_section.

Прикладную задачу я кое-как решил, но криво, медленно и не универсально. Так что не горит, но может кому интересно поломать голову (ну или ломать тут нечего, а я с устатку не вижу простого решения). :)

Разрабатываю общую шину (http://habrahabr.ru/company/floxim/blog/268467/) помаленьку. ...а еще у меня есть бложек (http://www.blogovo.ru/).
М
На сайте с 08.02.2006
Offline
59
#1


SELECT DISTINCT AA.id original_id, CC.id double_id
FROM offer AA
LEFT JOIN offer_to_section BB ON AA.id=BB.offer_id
LEFT JOIN offer CC ON AA.firm_id=CC.firm_id
LEFT JOIN offer_to_section DD ON CC.id=DD.offer_id AND BB.section_id=DD.section_id AND BB.classifier_id=DD.classifier_id
WHERE BB.offer_id IS NOT NULL AND AA.id<CC.id

Без группировки можно обойтись если original_id уникален - т.е. для каждого offer.id есть только один дубликат

Prior
На сайте с 03.03.2008
Offline
184
#2

эм...а нельзя сформировать временную общую таблицу и оттуда уже неуникальные поля выводить? ... или это медленно и неуниверсально? )

Ответы на вопрос - https://answers.net.pl
М
На сайте с 08.02.2006
Offline
59
#3

Дубль 2


SELECT AA.id original_id, CC.id double_id
FROM offer AA
LEFT JOIN offer_to_section BB ON AA.id=BB.offer_id
LEFT JOIN offer CC ON AA.firm_id=CC.firm_id
LEFT JOIN offer_to_section DD ON CC.id=DD.offer_id AND BB.section_id=DD.section_id AND BB.classifier_id=DD.classifier_id
WHERE BB.offer_id IS NOT NULL AND DD.offer_id IS NOT NULL AND AA.id<CC.id
GROUP BY BB.id (или AA.id)

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий