You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中两表多列组合重复数据查询及结果不符问题排查

问题分析与修正方案

原查询的核心问题:关联逻辑错误导致笛卡尔积

你当前的查询只通过EVENT_KEY关联两张表,WHERE条件只是单独过滤两张表的记录,并没有把五列(EVENT_KEY、ORDER_KEY、ORDER_NBR、CUSTOMER_KEY、BOOTH_KEY)作为组合关联条件。这会触发笛卡尔积:

  • 如果order_item_tbl里1条ORDER_NBR=1的记录,对应invoice_tbl里6条符合EVENT_KEY='14' AND BOOTH_KEY='12' AND CUSTOMER_KEY='41'的记录,关联后会生成6条冗余数据,最终COUNT(*)就会是6。
  • 同理,ORDER_NBR=2和3的记录各自对应2条符合条件的发票记录,所以计数为2。

这完全偏离了你要统计「五列组合标识的重复数据」的目标——你要的是同一组五列值在两张表的组合中重复出现,但原查询既没按五列组合关联,也没按五列组合统计,自然结果错误。

正确的查询逻辑

场景1:统计五列组合在两张表中的总出现次数

如果要统计某组五列值在两张表中一共出现了多少次(比如同一组合在订单表出现1次、发票表出现1次,总次数为2),可以先合并两张表的目标列,再按组合统计:

SELECT EVENT_KEY, ORDER_KEY, ORDER_NBR, CUSTOMER_KEY, BOOTH_KEY, COUNT(*) AS 重复次数
FROM (
    -- 从订单表取数,发票表的字段用NULL填充
    SELECT EVENT_KEY, ORDER_KEY, ORDER_NBR, NULL AS CUSTOMER_KEY, NULL AS BOOTH_KEY
    FROM ORDER_ITEM_TBL
    WHERE EVENT_KEY = '14' AND ORDER_KEY = '82' AND ORDER_NBR IN (1,2,3)
    UNION ALL
    -- 从发票表取数,订单表的字段用NULL填充
    SELECT EVENT_KEY, NULL AS ORDER_KEY, NULL AS ORDER_NBR, CUSTOMER_KEY, BOOTH_KEY
    FROM INVOICE_TBL
    WHERE EVENT_KEY = '14' AND CUSTOMER_KEY = '41' AND BOOTH_KEY = '12'
) AS 合并表
GROUP BY EVENT_KEY, ORDER_KEY, ORDER_NBR, CUSTOMER_KEY, BOOTH_KEY
HAVING COUNT(*) > 1;

场景2:统计关联后五列组合的重复次数

如果你的需求是「基于EVENT_KEY关联后,某组(ORDER_KEY, ORDER_NBR, CUSTOMER_KEY, BOOTH_KEY)重复出现多次」,需要按完整五列组合分组统计:

SELECT OI.EVENT_KEY, OI.ORDER_KEY, OI.ORDER_NBR, I.CUSTOMER_KEY, I.BOOTH_KEY, COUNT(*) AS 重复次数
FROM ORDER_ITEM_TBL OI
JOIN INVOICE_TBL I ON OI.EVENT_KEY = I.EVENT_KEY
WHERE OI.EVENT_KEY = '14' 
  AND OI.ORDER_KEY = '82' 
  AND I.BOOTH_KEY = '12' 
  AND I.CUSTOMER_KEY = '41' 
  AND OI.ORDER_NBR IN (1,2,3)
GROUP BY OI.EVENT_KEY, OI.ORDER_KEY, OI.ORDER_NBR, I.CUSTOMER_KEY, I.BOOTH_KEY
HAVING COUNT(*) > 1;

原查询只按OI.ORDER_NBR分组,会把该订单号对应的所有发票记录都累加,不管其他三列的值,这就是为什么计数远超预期——你要的是五列组合的重复,不是单一订单号的关联记录数。

内容的提问来源于stack exchange,提问作者Senix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 18:20:56