使用其他表中的值作为键来搜索重复项

时间:2019-01-31 09:43:34

标签: sql postgresql select

我想标题不能很好地解释问题,但让我们看一个例子,我有下表:

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 :(得分:0)

我想出了从表中提取external_id列表的想法,但是现在我要检查一下product和products_old是否都在顺序中。

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

答案 1 :(得分:0)

如果外部ID与内部ID不同,则可以使用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))