如何编写SQL查询,将同表其他行数据关联至当前行返回?
实现同表跨行取值的SQL查询方案
没问题,这个需求用**自连接(SELF JOIN)**就能轻松实现,我给你详细拆解一下:
首先先明确下示例表的数据(方便你对应自己的实际表):
-- 示例表数据(假设表名为`status_codes`) SC_CODE | SC_DESC | SC_ALT_CODE | SC_CANX_CODE --------|---------|-------------|------------- 1 | Test1 | NULL | 901 2 | Test2 | 3 | 902 901 | Test3 | NULL | 903 902 | Test4 | NULL | 904 3 | Test5 | NULL | NULL
你的核心需求是:基于当前行的SC_ALT_CODE或SC_CANX_CODE,匹配同表中对应SC_CODE的行,把该行的字段(比如SC_DESC)放到当前行结果里。
方案1:自连接写法(推荐,性能更优)
通过多次左连接(LEFT JOIN)关联同一张表,分别匹配替代代码和取消代码对应的信息:
SELECT t1.SC_CODE, t1.SC_DESC AS MAIN_DESC, t1.SC_ALT_CODE, t2.SC_DESC AS ALT_CODE_DESC, -- 对应SC_ALT_CODE的描述 t1.SC_CANX_CODE, t3.SC_DESC AS CANX_CODE_DESC -- 对应SC_CANX_CODE的描述 FROM status_codes t1 -- 关联替代代码对应的行 LEFT JOIN status_codes t2 ON t1.SC_ALT_CODE = t2.SC_CODE -- 关联取消代码对应的行 LEFT JOIN status_codes t3 ON t1.SC_CANX_CODE = t3.SC_CODE;
示例查询结果:
| SC_CODE | MAIN_DESC | SC_ALT_CODE | ALT_CODE_DESC | SC_CANX_CODE | CANX_CODE_DESC |
|---|---|---|---|---|---|
| 1 | Test1 | NULL | NULL | 901 | Test3 |
| 2 | Test2 | 3 | Test5 | 902 | Test4 |
| 901 | Test3 | NULL | NULL | 903 | NULL |
| 902 | Test4 | NULL | NULL | 904 | NULL |
| 3 | Test5 | NULL | NULL | NULL | NULL |
为什么用LEFT JOIN?因为你的SC_ALT_CODE和SC_CANX_CODE可能存在NULL值,LEFT JOIN会保留原表的所有行,关联不到的字段会显示NULL,不会过滤掉数据。
方案2:子查询写法(更简洁)
如果只需要单个字段的关联,子查询写法会更直观:
SELECT SC_CODE, SC_DESC AS MAIN_DESC, SC_ALT_CODE, -- 子查询获取SC_ALT_CODE对应的描述 (SELECT SC_DESC FROM status_codes WHERE SC_CODE = t1.SC_ALT_CODE) AS ALT_CODE_DESC, SC_CANX_CODE, -- 子查询获取SC_CANX_CODE对应的描述 (SELECT SC_DESC FROM status_codes WHERE SC_CODE = t1.SC_CANX_CODE) AS CANX_CODE_DESC FROM status_codes t1;
这个写法的结果和自连接完全一致,适合字段关联较少的场景。
注意事项
- 如果你的表数据量较大,记得给
SC_CODE字段加索引,不管哪种写法都会大幅提升查询速度。 - 可以根据实际需求调整返回的字段,比如不需要
SC_ALT_CODE的关联,直接去掉对应的JOIN或子查询即可。
内容的提问来源于stack exchange,提问作者Levi
相关产品推荐
相关产品推荐

