Как запросить все записи из нескольких таблиц с объединениями - PullRequest
1 голос
/ 10 июня 2019

У меня есть основная таблица employee_rates_year:

tier   skill   rate   year
1      28      110    2019
2      28      101    2019

моя колонка skill связана с таблицей сотрудников и таблицей субподрядчиков, для простоты здесь приведена сокращенная версия tblEmployees:

EMPLOYEEID   Skill   FullName
1            28      Employee One
2            28      Employee Two

и tblSubcontractors:

SUBCONTRACTORID   Skill   FullName
1                 28      Sub One
2                 28      Sub Two

Я пытаюсь показать уровень, рейтинг и год для каждого отдельного сотрудника и субподрядчика.

У меня естьпытался использовать разные объединения, но, кажется, ничто не дает мне информацию о каждом сотруднике / субподрядчике.

Вот мой запрос:

SELECT *
FROM employee_rates_year
left join tblsubcontractors on employee_rates_year.skill = tblsubcontractors.skill
left join tblemployees      on employee_rates_year.skill = tblemployees.skill

Проблема в том, что мой запрос показывает результаты, подобные следующим:

tier    skill    rate    year    tblEmployees.FullName    tblSubcontractors.Fullname

1       28       110     2019    Employee One             Sub One
2       28       101     2019    Employee Two             Sub Two

В то время как я пытаюсь получить:

tier   skill   rate   year   tblEmployees.FullName   tblSubcontractors.FullName

1      28      110    2019   Employee One
1      28      110    2019                           Sub One
2      28      101    2019   Employee Two
2      28      101    2019                           Sub Two

Я также пытался использовать WHERE, чтобы попытаться различить две таблицы и выбрать отдельные записи.

Ответы [ 4 ]

0 голосов
/ 10 июня 2019

Думаю, что проблема (или часть проблемы) заключается в «левом соединении», которое создает одну строку в результате для каждой строки в «левой» таблице. Поскольку employee_rates_year имеет только две строки, ваш результат для запроса будет содержать только 2 строки.

0 голосов
/ 10 июня 2019

Вам, похоже, нужно UNION ALL, а не двойное соединение:

SELECT e.*, t.FullName EmployeesFullName, NULL SubcontractorsFullName
FROM employee_rates_year e
left join tblsubcontractors t on e.skill = t.skill
UNION ALL
SELECT e.*, NULL, t.FullName
FROM employee_rates_year e
left join tblemployees t on e.skill = t.skill
ORDER BY e.tier, e.skill

Каждый запрос из 2 использует соединение employee_rates_year с 1 из других таблиц.Наконец, 2 набора результатов объединяются с UNION ALL.

0 голосов
/ 10 июня 2019

Используйте union all для объединения сотрудников и субконтакторов, а затем join и group by.Чтобы получить значения в «вертикальных списках», вы можете использовать row_number():

select er.skill, er.rate, er.year,
       max(e_fullname) as e_fullname,
       max(s_fullname) as s_fullname
from ((select e.skill, e.fullname as e_fullname, null as s_fullname,
             row_number() over (partition by e.skill order by e.fullname) as seqnum
       from tblemployees e
      ) union all
      (select s.skill, null as e_fullname, s.fullname as s_fullname,
             row_number() over (partition by s.skill order by s.fullname) as seqnum
       from tblsubcontractors s
      )
     ) es left join
     employee_rates er
     on es.skill = er.skill
group by er.skill, er.rate, er.year, seqnum;

Если вы просто хотите получить значения в отдельных списках (с NULL s), тогда вам не нужен row_number() трюк:

select er.skill, er.rate, er.year, e_fullname, s_fullname
from ((select e.skill, e.fullname as e_fullname, null as s_fullname
       from tblemployees e
      ) union all
      (select s.skill, null as e_fullname, s.fullname as s_fullname
       from tblsubcontractors s
      )
     ) es left join
     employee_rates er
     on es.skill = er.skill;
0 голосов
/ 10 июня 2019

вы никогда не должны использовать SELECT *, потому что .... ?

Попробуйте:

SELECT 
  tier,   
  skill,   
  rate,   
  year, 
  tblEmployees.FullName  As Employee
  '' As Subcontractor
FROM employee_rates_year
left join tblsubcontractors on employee_rates_year.skill = tblsubcontractors.skill
union all
SELECT 
  tier,   
  skill,   
  rate,   
  year, 
  '' As Employee
  tblSubcontractors.Fullname As Subcontractor
FROM employee_rates_year
left join tblemployees      on employee_rates_year.skill = tblemployees.skill
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...