【问题标题】:Left Join Three Tables, Combine Name Fields into one Column左连接三个表,将名称字段合并为一列
【发布时间】:2017-10-06 00:13:41
【问题描述】:

我们的数据库中有三种类型的用户。我们正在尝试生成报告。我可以离开加入他们。但如果我这样做,我有三个名字和三个姓氏列。如何将所有三者的数据合并到一列中。

SELECT e_job.objId AS 'Job Number', e_student.Lastname, e_student.Name, e_teachers.Lastname, e_teachers.Name, e_supportStaff.Lastname, e_supportStaff.Name
FROM e_job
LEFT JOIN e_student ON e_job.jName = e_student.username
LEFT JOIN e_teachers ON e_job.jName = e_teachers.username
LEFT JOIN e_supportStaff ON e_job.jName = e_supportStaff.username WHERE jStatus != 2 && jStatus != 7 && jStatus != -1

当前输出显示 7 列,每种类型的用户都以名字作为姓氏。

如何组合最后 6 列,以便所有名字都在 1 中,而姓氏在另一个中。

-------------------------------------
|Job Number |Last Name  |Fist Name  |
|-----------|-----------|-----------|
|1          |Doe        |John       |
|2          |Test       |Test       |
|3          |Test 2     |Test2      |
-------------------------------------

谢谢

【问题讨论】:

  • 它是什么数据库? (它对可用的解决方案有所不同)。始终在标签中包含数据库类型。
  • mysql 对不起,我没有意识到。
  • 顺便说一句不要使用单引号作为标识,使用单引号作为值。例如,AS "Last Name" 使用双引号,但我个人从不使用带空格的列名。

标签: mysql sql


【解决方案1】:

一个通用的解决方案可能是这样的联合查询:

SELECT e_job.objId AS "Job Number", e_student.Lastname AS "Job Number", e_student.Name AS "First Name"
FROM e_job
INNER JOIN e_student ON e_job.jName = e_student.username

UNION

SELECT e_job.objId AS 'Job Number', e_teachers.Lastname, e_teachers.Name
FROM e_job
INNER JOIN e_teachers ON e_job.jName = e_teachers.username

UNION

SELECT e_job.objId AS 'Job Number', e_supportStaff.Lastname, e_supportStaff.Name
FROM e_job
INNER JOIN e_supportStaff ON e_job.jName = e_supportStaff.username WHERE jStatus != 2 && jStatus != 7 && jStatus != -1

请注意,左连接已更改为内连接,因为我们不再需要迎合其他表,并且使用内连接我们只能获取具有匹配数据的行。

另一种选择,如果您希望区分不同类型的人,请引入另一列并改为使用 UNION ALL

SELECT e_job.objId AS "Job Number", 'Student' as Type, e_student.Lastname AS "Job Number", e_student.Name AS "First Name"
FROM e_job
INNER JOIN e_student ON e_job.jName = e_student.username

UNION ALL

SELECT e_job.objId AS 'Job Number', 'Teacher' as Type, e_teachers.Lastname, e_teachers.Name
FROM e_job
INNER JOIN e_teachers ON e_job.jName = e_teachers.username

UNION ALL

SELECT e_job.objId AS 'Job Number', 'Support' as Type, e_supportStaff.Lastname, e_supportStaff.Name
FROM e_job
INNER JOIN e_supportStaff ON e_job.jName = e_supportStaff.username WHERE jStatus != 2 && jStatus != 7 && jStatus != -1

注意: UNION 单独使用时,会从结果中删除重复的行(因此可能比不删除重复行的 UNION ALL 慢)。在我的第二个查询中,您不能从 3 个子查询中的任何一个中复制一行,因为每个子查询的第 2 列都不同,并且 UNION ALL 是有意义的。

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 2018-11-06
    • 1970-01-01
    • 2020-11-26
    • 2014-11-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-19
    相关资源
    最近更新 更多