Oracle10g下通过SQL JOIN查询关联编码及对应地址的问题咨询
问题修正说明
你原SQL的逻辑核心方向正确,但存在两处需要调整的点:
- SELECT子句中取的
b.code1是关联的Code1记录自身的Code1字段值,并非你指定编码关联的Code1值,虽然示例数据中二者值相同,但如果Code1记录的Code1字段不等于自身编码时就会返回错误结果,c.code2存在同样问题,应该直接取主表的code1、code2字段即可。 - 你使用的隐式内连接,当关联的Code1或Code2在表中无对应记录时,整条查询会返回空,改用左连接可以保证只要指定编码存在就会返回结果,缺失的关联地址字段返回空值。
正确SQL方案
方案1:取关联Code1、Code2对应的自身地址(符合需求描述的逻辑)
返回Code1对应自身存储的地址、Code2对应自身存储的地址:
SELECT a.code1, b.address AS code1_address, a.code2, c.address AS code2_address FROM address a LEFT JOIN address b ON a.code1 = b.code LEFT JOIN address c ON a.code2 = c.code WHERE a.code = 'DAN001';
返回结果如下:
| code1 | code1_address | code2 | code2_address |
|---|---|---|---|
| DAN004 | Delhi, India | DAN005 | Ever, Belgium |
如果需要地址转为全大写,可使用Oracle的UPPER()函数包裹地址字段,例如UPPER(b.address) AS code1_address。
方案2:返回你给出的预期结果
你给出的预期结果中Code1地址为指定编码自身的地址,不需要关联查询,直接查询单表即可:
SELECT code1, address AS code1_address, code2, UPPER(address) AS code2_address FROM address WHERE code = 'DAN001';
返回结果和你给出的预期一致:
| code1 | code1_address | code2 | code2_address |
|---|---|---|---|
| DAN004 | ABC, Newyork. | DAN005 | EVER, BELGIUM |
内容的提问来源于stack exchange,提问作者sanjay singh chauhan
相关产品推荐
相关产品推荐

