【发布时间】:2019-04-18 22:01:03
【问题描述】:
我有一个 sql 查询如下:
table1 有:
name1, name2, date .....
user_table 有:
employee_id, employee_name
table1 在 name1 和 name2 列下具有 id 值,user_table 具有 id 和相应的名称。
这将是一个直接的加入。但是在日期之后2019-03-20、name1 和name2 来自table1 有id 像100101、100102。而在2019-03-20、name1和name2之前有tom、dick、harry等值。
这里的目标很明显,用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,双方的列数必须相同。但是上面的查询会产生两个额外的列name1a,name2a。现在我可以只选择列名来避免这个问题,但是如果我有太多列要在 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