如何使用SQL从查询表中使用对应的ID获取员工名称

时间:2019-04-18 22:01:03

标签: sql postgresql join

我有一个如下的sql查询:

table1具有:

 name1, name2, date .....

user_table具有:

employee_id, employee_name

table1在列idname1下具有name2值,而user_table具有id和相应的名称。

这将是直接的加入。但是在日期2019-03-20之后,name1中的name2table1具有id,就像100101100102一样。在2019-03-20之前,name1name2具有诸如tomdickharry等值。

这里的目标很明显,就是用id中的员工姓名替换table1

我最初的想法是在UNION之前和table1之后的2019-03-20的两个段之间进行2019-03-20

select t.*, u.employee_name as name1a, u1.employee_name as name2a 
from table1 t
  left join user_table u on t.name1= u.employee_id
  left join user_table u1 on t.name2 = u1.employee_id
where
  cast(t.approvedate as date) > '2019-03-20';

问题1 :是否有比UNION更好的解决方案?

问题2 :要执行UNION,双方的列数必须相同。但是上面的查询将产生另外两个列name1aname2a。现在,我可以选择列名来避免该问题,但是如果我在select语句中要列出的列太多,该怎么办?


  

已更新样品表和所需结果。我有以下表格:

test_sales

CREATE TABLE test_sales (product varchar(20) ,sales_date varchar(20), person_1 varchar(20) , person_2 varchar(20) ) ;

INSERT INTO test_sales (product, sales_date, person_1, person_2) VALUES ('abc', '2019-04-01', '101', '110'), ('abc', '2019-04-10', '102', '111'),('abc', '2019-03-15', 'tom', 'john'), ('xyz', '2019-03-21', 'tom', 'dick'), ('xyz', '2019-03-29', 'harry', 'josh'), ('xyz', '2019-04-05', '102', '110'), ('xyz', '2019-03-29', 'harry', 'josh'), ('pqr', '2019-04-02', '101', '111');

enter image description here

test_user

enter image description here

CREATE TABLE test_user (employee_id varchar(10) ,employee_name varchar(20));

INSERT INTO test_user (employee_id, employee_name) VALUES ('101', 'john'),('102', 'josh'), ('110', 'tom'), ('111', 'dick');

我想获得以下输出,其中空白单元格也将具有名称。

enter image description here

现在,我有了这个查询,该查询产生带有空白单元格的结果。

select s.product, s.sales_date, u.employee_name as person_1, u1.employee_name as person_2 from test_sales s left join test_user u on s.person_1 = u.employee_id left join test_user u1 on s.person_2 =u1.employee_id;

1 个答案:

答案 0 :(得分:0)

您可以使用OR运算符加入

 select t.*, u.employee_name as name1a, u1.employee_name as name2a 
 from table1 t
    left join user_table u 
       on t.name1= u.employee_id
          OR t.name2 = u.employee_id
          OR t.name1 = u.employee_name
          OR t.name2 = u.employee_name

它不会很快,但是可以解决问题。 (可选)您可以进行4个连接(name1使用name2id,然后命名使用name1name2)并使用合并:

 select t.*, COALESCE(u.employee_name, u2.employee_name, u3.employee_name, u4.employee_name) AS employee_name
 from table1 t
    left join user_table u 
       on t.name1= u.employee_id
    left join user_table u2 
       ON t.name2 = u2.employee_id
    left join user_table u3 
       ON t.name1 = u3.employee_name
    left join user_table u4 
       ON t.name2 = u4.employee_name