как получить имя сотрудника, используя соответствующий идентификатор из таблицы поиска, используя sql - PullRequest
0 голосов
/ 19 апреля 2019

У меня есть запрос 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

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 голосов
/ 19 апреля 2019

Вы можете присоединиться, используя оператор ИЛИ:

 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 для имени) и использовать coalesce:

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...