У меня есть запрос 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 : Чтобы сделать СОЮЗ, обе стороны должны иметь одинаковое количество столбцов. Но приведенный выше запрос даст два дополнительных столбца 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');
![enter image description here](https://i.stack.imgur.com/KIzH2.png)
test_user
![enter image description here](https://i.stack.imgur.com/vlb85.png)
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](https://i.stack.imgur.com/31bOV.png)
Прямо сейчас у меня есть этот запрос, который дает результат с пустыми ячейками.
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;