【问题标题】:how to get employee name using corresponding id from lookup table using sql如何使用sql从查找表中使用相应的id获取员工姓名
【发布时间】:2019-04-18 22:01:03
【问题描述】:

我有一个 sql 查询如下:

table1 有:

 name1, name2, date .....

user_table 有:

employee_id, employee_name

table1name1name2 列下具有 id 值,user_table 具有 id 和相应的名称。

这将是一个直接的加入。但是在日期之后2019-03-20name1name2 来自table1id100101100102。而在2019-03-20name1name2之前有tomdickharry等值。

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

我最初的想法是在table1 的两个部分之间做一个UNION,在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');

test_user

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');

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

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

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;

【问题讨论】:

  • "tom, dick, harry etc" 不是表中的 ID users?
  • 没有。这些混合值仅在表 1 中为 . user_table 有 id 如 100101、100102 和对应的名字如 tom、dick 等。
  • 那么你的真正目标应该是解决这个问题并且只使用 ID。
  • 目前还做不到。
  • 样本数据和期望的结果真的很有帮助

标签: sql postgresql join


【解决方案1】:

您可以使用 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 次连接(name1name2 用于 id,然后 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

【讨论】:

  • 对于第一个解决方案 u1.employee_name as name2a ...您的意思是 u 吗?而不是 u1 ?如果这样做,这将为 name1a 和 name2a 生成相同的名称。如果您实际上是指 u1,那么您的代码中没有 u1 的别名。
  • 对不起。应该删除选择中的整个列。输出中只有一个employee_name 列
  • 我已经用示例数据更新了问题。两个名称列都是必需的,将它们组合在一个列中没有意义。
猜你喜欢
  • 1970-01-01
  • 2019-02-13
  • 1970-01-01
  • 2022-12-12
  • 2017-01-07
  • 1970-01-01
  • 2022-11-18
  • 2022-11-01
  • 2021-09-24
相关资源
最近更新 更多