Поиск дубликатов с использованием значений из другой таблицы в качестве ключей - PullRequest
0 голосов
/ 31 января 2019

Полагаю, что заголовок плохо объясняет вопрос, но давайте рассмотрим пример. У меня есть следующие таблицы:

orders table:
order_id
9
10
11
12

order_details table:
order_id, product_id  
9,        7
9,        8
10,       5
10,       6
11,       6
11,       7
12,       8
12,       9

products table:
product_id, product_name, price, ext_id  
5,          poteto,       4.99,  null
6,          potato,       7.5,   55
7,          orange,       7.99,  77
8,          green apple,  5.99,  88
9,          gren-aple,    6.99,  null

products_old table:
product_id, key,              value
5,          product name,     poteto
5,          price,            4.99
5,          external id,      55      
9,          product name,     gren-aple
9,          price,            6.99
9,          external id,      88    

Я хочу найти заказы с дублированными товарами (только разные product_id, но одинаковыеexternal_id) если имя продукта будет идентичным, это будет легко, используя следующий запрос:

select od.order_id
from order_details od join
     products p
     on od.product_id = p.product_id
group by od.order_id
having count(p.product_name) > count(distinct p.product_name)

Но как справиться с этим, когда имена разные (например, некоторые орфографические ошибки и т. д.), но у меня есть дополнительная таблицагде external_id (то же самое для тех же продуктов, например, зеленого яблока и gren-aple) хранится как показано выше?Обратите внимание, что в таблице products_old присутствуют только дубликаты с нулевым значением ext_id.Буду очень признателен за помощь:)!

Ответы [ 2 ]

0 голосов
/ 31 января 2019

Если внешние идентификаторы отличаются от внутренних идентификаторов, вы можете использовать coalesce():

having count(coalesce(p.ext_id, p.product_id)) > count(distinct coalesce(p.ext_id, p.product_id))

В вашем случае вы также можете построить значения:

having count(coalesce('EXT:' || p.ext_id::text, 'INT:' || p.product_id)) >
       count(distinct coalesce('EXT:' || p.ext_id::text, 'INT:' || p.product_id))
0 голосов
/ 31 января 2019

Мне пришла в голову идея извлечь список external_id из таблицы, но я застрял сейчас, чтобы проверить, есть ли в порядке как products, так и products_old.

externalIDs AS (select CAST (value as INT) from products_old where key = 'external_id')
...