SQL查询求助:如何根据ID匹配的源表获取对应属性?
问题分析与解决
核心问题:数据插入错误
你的SOURCE2表插入数据时,source_name字段填成了'source1',但你期望匹配SOURCE2时返回'source2'——这是导致所有结果都是source1的直接原因。
另外你疑惑BASE.id=2时SOURCE1.source_name不为空,实际情况是:BASE.id=2在SOURCE1中没有匹配项,SOURCE1.source_name是NULL,但SOURCE2的source_name被错误插入为'source1',所以COALESCE取到了SOURCE2的这个值,最终显示source1。你可以用这条查询验证:
SELECT SOURCE1.source_name, SOURCE2.source_name FROM BASE LEFT JOIN SOURCE1 ON SOURCE1.id = BASE.id LEFT JOIN SOURCE2 ON SOURCE2.id = BASE.id WHERE BASE.id = 2;
结果会返回NULL和'source1',这就是COALESCE输出source1的原因。
解决步骤
1. 修正SOURCE2的数据
先把SOURCE2的source_name改成正确的'source2':
-- 方式1:更新现有数据 UPDATE SOURCE2 SET source_name = 'source2'; -- 方式2:清空后重新插入(如果允许) TRUNCATE TABLE SOURCE2; INSERT INTO SOURCE2 (id, source_name) VALUES (2, 'source2'), (4, 'source2'), (6, 'source2');
2. 优化查询逻辑(更可靠)
如果要严格实现「匹配SOURCE1返回source1,匹配SOURCE2返回source2」的规则,用CASE WHEN比COALESCE更清晰,还能避免后续出现id同时存在于两个源表时的优先级问题:
SELECT CASE WHEN SOURCE1.id IS NOT NULL THEN 'source1' WHEN SOURCE2.id IS NOT NULL THEN 'source2' ELSE BASE.source_name -- 没有匹配时返回base的默认值 END AS source_name FROM BASE LEFT JOIN SOURCE1 ON SOURCE1.id = BASE.id LEFT JOIN SOURCE2 ON SOURCE2.id = BASE.id ORDER BY BASE.id;
执行后就能得到你预期的交替source1、source2的结果。
内容的提问来源于stack exchange,提问作者BigBoy1337
相关产品推荐
相关产品推荐

