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
相关产品推荐
相关产品推荐

