多表关联查询异常:仅需返回Table_D独有记录却结果超量求助
修正查询以返回无重复的Table_D记录
原查询返回结果行数远超Table_D实际数据量的原因是:多表内连接时,Table_A/Table_B/Table_C中存在多条记录对应同一条Table_D记录,导致D的记录被重复输出。以下是几种可行的修正方案:
方案1:使用DISTINCT去重
利用Table_D的objectid唯一性,直接对D的字段去重,确保每条记录仅返回一次:
SELECT DISTINCT D.* FROM Table_A A JOIN Table_B B ON B.documentid = A.documentid JOIN Table_C C ON B.objectid = C.formid AND B.instance_seq = C.instance_seq AND C.src_exp = DATE '9999-12-31' JOIN Table_D D ON C.sourceid = D.objectid AND C.instance_seq = D.instance_seq AND D.src_exp = DATE '9999-12-31' WHERE A.src_exp = DATE '9999-12-31' AND A.form = 'Tentative'
方案2:使用EXISTS子查询(性能更优)
通过子查询判断是否存在匹配的关联记录,避免多表连接产生的重复结果,同时减少中间数据量:
SELECT D.* FROM Table_D D WHERE D.src_exp = DATE '9999-12-31' AND EXISTS ( SELECT 1 FROM Table_A A JOIN Table_B B ON B.documentid = A.documentid JOIN Table_C C ON B.objectid = C.formid AND B.instance_seq = C.instance_seq AND C.src_exp = DATE '9999-12-31' WHERE A.src_exp = DATE '9999-12-31' AND A.form = 'Tentative' AND C.sourceid = D.objectid AND C.instance_seq = D.instance_seq )
方案3:基于唯一键GROUP BY分组
以Table_D的唯一标识字段分组,强制每条D记录仅返回一次:
SELECT D.* FROM Table_A A JOIN Table_B B ON B.documentid = A.documentid JOIN Table_C C ON B.objectid = C.formid AND B.instance_seq = C.instance_seq AND C.src_exp = DATE '9999-12-31' JOIN Table_D D ON C.sourceid = D.objectid AND C.instance_seq = D.instance_seq AND D.src_exp = DATE '9999-12-31' WHERE A.src_exp = DATE '9999-12-31' AND A.form = 'Tentative' GROUP BY D.objectid, D.instance_seq, D.src_exp -- 需包含D的所有字段或唯一键组合
方案选择建议
- 若仅需快速修正,优先用
DISTINCT,实现简单; - 追求查询性能,优先用
EXISTS,它会在找到匹配记录后立即停止检索,无需处理重复的中间结果; GROUP BY更适合需要同时聚合其他字段的场景,单纯去重时无需使用。
内容的提问来源于stack exchange,提问作者As0608
相关产品推荐
相关产品推荐

