Oracle SQL查询:从关联表获取列值问题求助
解决多表关联获取公司名称的问题
嘿,刚接触SQL遇到这种多表关联的问题太正常了,别慌!我先帮你把表结构理清楚,然后一步步给你解决方案。
首先先明确你的三张表结构(我稍微规整了一下格式):
表结构
Table 1(主表)
ID* | Field 1 | Field 2 1 | ABC | XYZ
Table 2(关联表,存储主表ID与供应商/客户的公司ID映射)
ID-FK (from Table1) | Company - Vendor | Company - Supplier 1 | 3 | 2
*注意:Company - Vendor或Company - Supplier字段可能为NULL
Table 3(公司信息表)
Company ID | Company name 1 | Company A 2 | Company B 3 | Company C
你的需求
要得到这样的输出:
ID | Field 1 | Company - Vendor | Company - Supplier 1 | ABC | Company C | Company B
问题分析
你之前用内连接没成功,大概率是因为内连接(INNER JOIN)会过滤掉关联字段为NULL的行。如果Company - Vendor或Company - Supplier有NULL值,内连接会直接把这条主表数据排除掉,而我们需要的是即使某个公司ID为NULL,也要保留主表的数据,只是对应的公司名称显示NULL(或者自定义默认值)。
解决方案:使用左连接(LEFT JOIN)
我们需要把Table2的两个公司ID字段分别关联到Table3两次,给Table3起不同的别名来区分供应商和客户,同时用左连接来保留所有主表数据。
完整SQL语句如下:
SELECT t1.ID, t1."Field 1", v."Company name" AS "Company - Vendor", s."Company name" AS "Company - Supplier" FROM "Table 1" t1 -- 先关联Table2,因为主表和关联表是一一对应的(根据你的示例) JOIN "Table 2" t2 ON t1.ID = t2."ID-FK from table 1" -- 左连接获取供应商名称,即使Vendor ID为NULL也保留数据 LEFT JOIN "Table 3" v ON t2."Company - Vendor" = v."Company ID" -- 左连接获取客户名称,即使Supplier ID为NULL也保留数据 LEFT JOIN "Table 3" s ON t2."Company - Supplier" = s."Company ID" -- 如果只需要特定ID的数据,加上WHERE条件 WHERE t1.ID = 1;
额外优化(可选)
如果想把NULL的公司名称替换成更友好的内容(比如“未指定”),可以用COALESCE函数:
SELECT t1.ID, t1."Field 1", COALESCE(v."Company name", '未指定') AS "Company - Vendor", COALESCE(s."Company name", '未指定') AS "Company - Supplier" FROM "Table 1" t1 JOIN "Table 2" t2 ON t1.ID = t2."ID-FK from table 1" LEFT JOIN "Table 3" v ON t2."Company - Vendor" = v."Company ID" LEFT JOIN "Table 3" s ON t2."Company - Supplier" = s."Company ID" WHERE t1.ID = 1;
这样就能完美得到你想要的结果啦!
内容的提问来源于stack exchange,提问作者Prasanth P J
相关产品推荐
相关产品推荐

