【问题标题】:Merge two columns and find corresponding name to another filed合并两列并找到另一个字段的对应名称
【发布时间】:2018-06-13 04:41:29
【问题描述】:

我有一个名为“staff”的表。该表有 10 列:staffno、fname、lname、position、sex、dob、salary、branchno 和 manager。 “manager”列是人员经理的staffno,如果他/她有的话,否则为NULL。

我也想找到每个员工及其经理的姓名(如果他们有的话)并将名字和姓氏合并在一列中。

我的代码如下:

SELECT CONCAT(staff.fname, ' ', staff.lname) AS StaffName ,
CONCAT(staff.fname, ' ', staff.lname) AS ManagerName
FROM staff WHERE staff.manager IS NOT NULL AND staff.staffno = staff.manager;

这段代码正确吗?

【问题讨论】:

  • 没有。如果员工有经理,它只会显示员工的名字和姓氏两次。
  • 当您发布问题时,请使用正确的标签。
  • 我已经删除了所有这些 dbms 标签。将其中一个放回去,用于实际使用的 dbms。

标签: sql


【解决方案1】:

你需要一个OUTER JOIN

CREATE TABLE staff(staffno int, manager int, fname varchar(25),lname varchar(25));
INSERT INTO staff VALUES(1,null,'John','Brown');
INSERT INTO staff VALUES(2,1,'Joe','Miller');
INSERT INTO staff VALUES(3,1,'Julia','Roberts');

SELECT CONCAT(s1.fname, ' ', s1.lname) AS ManagerName ,
       CONCAT(s2.fname, ' ', s2.lname) AS StaffName
  FROM staff s1 
 RIGHT OUTER JOIN staff s2
    ON s1.staffno = s2.manager
 ORDER BY COALESCE(s2.manager,0), s2.staffno; 

 ManagerName    StaffName
 -----------    -----------
                 John Brown
 John Brown      Joe Miller
 John Brown      Julia Roberts

上面的 SQL 适用于标记数据库,例如 mysqlpostgresqlsql-server

SQL Fiddle Demo

【讨论】:

  • 感谢您的回答。但是我们如何考虑这两个条件:1- 如果员工有经理,则为员工的姓名 2- 员工对应经理的姓名?
  • @Farzad 不客气。取决于列 ManagerName 是否为空。
【解决方案2】:

也许你应该试试这个:

SELECT CONCAT(staff.fname, ' ', staff.lname) AS StaffName,
CONCAT((SELECT fname FROM staff WHERE staff.staffno = staff.manager), ' ', (SELECT lname FROM staff WHERE staff.staffno = staff.manager)) AS ManagerName
FROM staff;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2017-10-06
    • 2013-01-27
    • 2022-12-06
    • 1970-01-01
    • 2010-11-13
    • 2016-04-25
    相关资源
    最近更新 更多