如何合并两个SQL查询结果为多列形式而非单列拼接?
解决方案:用LEFT JOIN合并多列结果集
看起来你想要把系主任的信息,和他们(如果同时担任院长)对应的学校信息整合到同一行里,而不是把结果堆叠到同一列。这时候**JOIN(连接)**就是正确的工具——UNION是用来合并行的,而我们需要的是扩展列,保留所有系主任的信息,同时关联上他们作为院长的学校数据(没有的话显示空值)。
第一步:重构你的查询(用标准JOIN语法)
首先,把你原来用逗号的老式连接改成更清晰、更不易出错的INNER JOIN语法,分别整理出院长-学校数据,和系主任-系数据:
子查询1:获取院长对应的学校和教授信息
SELECT DISTINCT s.SchoolName, p.ProfessorID, -- 用唯一ID关联,避免同名教授的问题 p.LastName, p.FirstName FROM dbo.SchoolDean sd INNER JOIN dbo.School s ON sd.SchoolID = s.SchoolID INNER JOIN dbo.Professor p ON sd.ProfessorID = p.ProfessorID
子查询2:获取系主任对应的系和教授信息
SELECT DISTINCT d.DepartmentName, p.ProfessorID, p.LastName, p.FirstName FROM dbo.DepartmentChair dc INNER JOIN dbo.Department d ON dc.DepartmentID = d.DepartmentID INNER JOIN dbo.Professor p ON dc.ProfessorID = p.ProfessorID
第二步:用LEFT JOIN合并结果
我们用LEFT JOIN把系主任的数据集作为主表,关联院长的数据集——这样所有系主任的信息都会保留,那些不是院长的教授,对应的学校列会自动显示NULL(空值),完全符合你的需求。
最终的完整查询:
SELECT dep.DepartmentName, dep.LastName AS DeptChairLastName, dep.FirstName AS DeptChairFirstName, sch.SchoolName AS DeanSchoolName, sch.LastName AS DeanLastName, sch.FirstName AS DeanFirstName FROM ( -- 系主任及对应系信息 SELECT DISTINCT d.DepartmentName, p.ProfessorID, p.LastName, p.FirstName FROM dbo.DepartmentChair dc INNER JOIN dbo.Department d ON dc.DepartmentID = d.DepartmentID INNER JOIN dbo.Professor p ON dc.ProfessorID = p.ProfessorID ) dep LEFT JOIN ( -- 院长及对应学校信息 SELECT DISTINCT s.SchoolName, p.ProfessorID, p.LastName, p.FirstName FROM dbo.SchoolDean sd INNER JOIN dbo.School s ON sd.SchoolID = s.SchoolID INNER JOIN dbo.Professor p ON sd.ProfessorID = p.ProfessorID ) sch ON dep.ProfessorID = sch.ProfessorID ORDER BY dep.DepartmentName;
关键说明
- 用ProfessorID关联而非名字:你的示例里出现了同名教授(比如Walker Joanne),用唯一的ProfessorID作为关联条件,能避免把不同教授的信息错误关联在一起。
- LEFT JOIN的作用:保证所有系主任的记录都被保留,即使这个教授没有担任院长,对应的学校列会显示空值,完美匹配你允许空值的要求。
- 列别名的使用:给重复的列(比如LastName、FirstName)起不同的别名,让结果集的含义更清晰,避免列名冲突。
用这个查询,你就能得到和你期望一致的结果——比如MacNamara Christine那行会显示对应的Science学院信息,而Hastings Timothy这类非院长的系主任,学校列会是空值。
内容的提问来源于stack exchange,提问作者Emely G
相关产品推荐
相关产品推荐

