我想标题不能很好地解释问题,但让我们看一个例子,我有下表:
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为空的重复项。 我非常感谢您的帮助:)!
答案 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))