如何使用DISTINCT让两表关联差集查询结果按pair字段去重
问题原因
- WHERE条件优先级错误:SQL中
AND优先级高于OR,你的原查询条件实际执行逻辑为a.pair_id IS NULL OR (b.id IS NULL AND b.exchange_active = 'true'),不符合你查询差异数据的预期,需要给OR两侧的判断加括号。 - 重复数据产生:当同一个
pair对应多条匹配记录时,就会返回重复的pair结果,你可以通过DISTINCT ON(PostgreSQL特有)或GROUP BY实现按pair去重。
修正后查询语句
方案1:PostgreSQL环境用DISTINCT ON(推荐,可自定义同pair下保留哪条记录)
该语法会直接按括号内的字段去重,每个pair仅返回第一条匹配记录:
SELECT DISTINCT ON (b.pair) b.id, b.pair, b.exchange_id FROM order_splits_config a FULL OUTER JOIN active_pairs b ON a.pair_id = b.id WHERE (a.pair_id IS NULL OR b.id IS NULL) AND b.exchange_active = true -- 可调整ORDER BY规则指定同pair下的保留逻辑,如下为取id最小的记录 ORDER BY b.pair, b.id ASC;
方案2:通用SQL环境用GROUP BY
适合所有支持标准SQL的数据库,通过聚合函数指定同pair下其他字段的取值规则:
SELECT MIN(b.id) AS id, b.pair, MIN(b.exchange_id) AS exchange_id FROM order_splits_config a FULL OUTER JOIN active_pairs b ON a.pair_id = b.id WHERE (a.pair_id IS NULL OR b.id IS NULL) AND b.exchange_active = true GROUP BY b.pair;
内容的提问来源于stack exchange,提问作者user1285928
相关产品推荐
相关产品推荐

