我有一个如下的sql查询:
table1
具有:
name1, name2, date .....
user_table
具有:
employee_id, employee_name
table1
在列id
和name1
下具有name2
值,而user_table
具有id
和相应的名称。
这将是直接的加入。但是在日期2019-03-20
之后,name1
中的name2
和table1
具有id
,就像100101
,100102
一样。在2019-03-20
之前,name1
和name2
具有诸如tom
,dick
,harry
等值。
这里的目标很明显,就是用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,双方的列数必须相同。但是上面的查询将产生另外两个列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;
答案 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
使用name2
和id
,然后命名使用name1
和name2
)并使用合并:
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