You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个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;

关键说明

  1. 用ProfessorID关联而非名字:你的示例里出现了同名教授(比如Walker Joanne),用唯一的ProfessorID作为关联条件,能避免把不同教授的信息错误关联在一起。
  2. LEFT JOIN的作用:保证所有系主任的记录都被保留,即使这个教授没有担任院长,对应的学校列会显示空值,完美匹配你允许空值的要求。
  3. 列别名的使用:给重复的列(比如LastName、FirstName)起不同的别名,让结果集的含义更清晰,避免列名冲突。

用这个查询,你就能得到和你期望一致的结果——比如MacNamara Christine那行会显示对应的Science学院信息,而Hastings Timothy这类非院长的系主任,学校列会是空值。

内容的提问来源于stack exchange,提问作者Emely G

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:27:49