DB2 SQL查询需求:找出AMOUNT列值重复且对应CASH_CO列值不同的数据对
修正你的DB2 SQL查询:找出重复AMOUNT且对应CASH_CO不同的记录
嘿,我瞅了瞅你写的查询语句,这明显踩了好几个坑——难怪查不到结果呢!咱们一步步拆解问题,再给你俩靠谱的解决方案:
先说说原查询的核心问题
- 表名拼写不一致:你给S1关联的是
HI_MTI_O1(字母O),S2却是HI_MTI_01(数字0),这俩是完全不同的表,根本关联不上符合条件的数据! - JOIN逻辑完全跑偏:你要找的是同一
ACCOUNT_ID下,AMOUNT重复但CASH_CO不同的记录,但原查询里写的S1.AMOUNT = S2.CASH_CO是把金额和另一条记录的CASH_CO关联,完全不符合需求。 - WHERE条件自相矛盾:
S1.CASH_CO <> S1.CASH_CO是个永远不成立的条件(自己不可能不等于自己),直接把所有结果都过滤掉了,后面的条件再对也没用。
方案1:自关联查询(直观易懂)
先把表名统一,然后用自关联找到同一账户、相同AMOUNT但CASH_CO不同的记录,同时排除同一条记录自我关联的情况:
SELECT DISTINCT S1.AMOUNT, S1.CASH_CO, S1.ACCOUNT_ID FROM HI_MTI_O1 S1 INNER JOIN HI_MTI_O1 S2 ON S1.ACCOUNT_ID = S2.ACCOUNT_ID AND S1.AMOUNT = S2.AMOUNT AND S1.CASH_CO <> S2.CASH_CO AND S1.ROWID <> S2.ROWID -- 用ROWID避免同一条记录自我关联,也可以换成表的主键列(比如ID) FETCH FIRST 100 ROWS ONLY;
加DISTINCT是为了避免返回重复的记录对(比如S1和S2互换的情况)。
方案2:窗口函数(性能更优)
如果数据量较大,用窗口函数只扫描一次表就能搞定,效率更高:
WITH duplicate_amounts AS ( SELECT AMOUNT, CASH_CO, ACCOUNT_ID, -- 按账户+金额分组,统计该组内不同CASH_CO的数量 COUNT(DISTINCT CASH_CO) OVER (PARTITION BY ACCOUNT_ID, AMOUNT) AS cash_co_count FROM HI_MTI_O1 ) SELECT AMOUNT, CASH_CO, ACCOUNT_ID FROM duplicate_amounts -- 数量大于1说明该金额下有不同的CASH_CO WHERE cash_co_count > 1 FETCH FIRST 100 ROWS ONLY;
小提示
- 务必确认表名是
HI_MTI_O1还是HI_MTI_01,别再把字母O和数字0搞混啦! - 如果你的表有主键(比如
TRANSACTION_ID),用主键代替ROWID会更可靠,毕竟有些场景下ROWID可能有特殊限制。
内容的提问来源于stack exchange,提问作者Tommeck37
相关产品推荐
相关产品推荐

