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

关联查询结果去重:交易匹配SQL重复结果解决需求

解决交易匹配查询中的重复条目问题

看起来你遇到了自连接交易表时出现重复匹配的问题,这在交易配对场景里很常见,我来帮你梳理下问题原因和解决方案:

问题根源分析

你当前的查询没有限制配对的唯一性,也没有明确限定必须是同一货币对的交易:

  • 当交易A和交易B满足匹配条件时,查询会同时返回(A,B)和(B,A)两组结果,导致重复
  • 缺少pair_id相等的条件,可能会出现跨不同货币对的无效匹配

优化后的查询语句

下面的SQL会帮你获取唯一的可执行匹配交易,同时避免无效配对:

SELECT d1.*, d2.*
FROM deals d1
JOIN deals d2 
  ON d1.pair_id = d2.pair_id  -- 确保匹配的是同一货币对的交易
  AND d1.amount_to_sell = d2.amount_to_buy  -- d1要卖出的金额等于d2要买入的金额
  AND d1.amount_to_buy = d2.amount_to_sell  -- d1要买入的金额等于d2要卖出的金额
  AND d1.id < d2.id  -- 核心:确保每对交易只返回一次,消除(A,B)和(B,A)的重复
  AND d1.user_id != d2.user_id;  -- 可选:禁止同一用户的交易自我匹配(根据业务需求调整)

关键优化点说明

  • d1.pair_id = d2.pair_id:必须加入这个条件,否则会出现不同货币对之间的无效匹配(比如美元兑欧元的交易和欧元兑英镑的交易被错误配对)
  • d1.id < d2.id:通过限制交易ID的大小关系,让每一对有效匹配只被检索一次,彻底解决重复问题
  • d1.user_id != d2.user_id:如果业务规则不允许用户自己和自己完成交易,就加上这个条件,避免无效的自我配对

关联货币表的增强查询(可选)

如果需要在结果中显示具体的货币种类(比如to_sell和to_buy对应的货币),可以关联currencies表:

SELECT 
  d1.id AS deal1_id,
  d1.user_id AS deal1_user,
  c.to_sell AS sell_currency,
  c.to_buy AS buy_currency,
  d1.amount_to_sell,
  d1.amount_to_buy,
  d2.id AS deal2_id,
  d2.user_id AS deal2_user
FROM deals d1
JOIN deals d2 
  ON d1.pair_id = d2.pair_id
  AND d1.amount_to_sell = d2.amount_to_buy
  AND d1.amount_to_buy = d2.amount_to_sell
  AND d1.id < d2.id
  AND d1.user_id != d2.user_id
JOIN currencies c ON d1.pair_id = c.id;

这个查询会输出更直观的结果,包含交易双方的信息和对应的货币种类。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:07:32