【问题标题】:Search duplicates using values from other table as keys使用其他表中的值作为键搜索重复项
【发布时间】:2023-03-13 12:12:01
【问题描述】:

我猜标题没有很好地解释这个问题,但让我们看一个例子,我有以下表格:

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)存储为如上所示? 请注意,只有具有空 ext_id 的重复项才在表 products_old 中。 非常感谢您的帮助:)!

【问题讨论】:

  • 考虑在查找(主)表中为每个 product_name 保留唯一的 product_id,例如 1-potato 2-orange 3-green apple .....。并且不要将product_names 作为字符串保存在子表中,而是将它们保存为从查找表派生的整数参考值。
  • 我需要在不改变表结构的情况下解决这个问题
  • 设计问题将来会成为头疼的问题,最好从一开始就解决:)

标签: sql postgresql select


【解决方案1】:

我想出了从表中提取 external_id 列表的想法,但我现在卡在检查 products 和 products_old 是否都在订单中。

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

【讨论】:

    【解决方案2】:

    如果外部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))
    

    【讨论】:

    • 不知何故它对我不起作用,我设法以更“友好”的方式生成 products_old 表,我认为以后更容易操作:oldproducts AS (select product_id, CAST(value as INT) AS external_id from products_old where key = 'external_id') 但我仍然卡住了,尝试了几个查询但结果它们毫无意义。
    猜你喜欢
    • 1970-01-01
    • 2019-12-27
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 2015-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多