Запрос SQL Server не дает правильных результатов - PullRequest
0 голосов
/ 13 февраля 2019

У меня есть 3 таблицы на сервере Sql.Ниже приведена структура таблиц.

enter image description here

Таблица сотрудников будет содержать список сотрудников.Таблица проекта будет иметь список проектов.Таблица сопоставления будет содержать сопоставление между сотрудником и проектом, а также часы для каждой недели, заканчивающейся.Таблица сопоставления не будет иметь сопоставления для всех сотрудников и проекта для всех окончаний недели.Мне нужно присоединиться к трем таблицам и получить результаты всех сотрудников для конкретного проекта в течение недели.Если у конкретного сотрудника нет часов для этого выходного дня, данные сотрудника должны быть указаны, но часы должны быть равны 0.

enter image description here

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

    SELECT RT.EMP_ID,RT.EMP_NAME, RT.EMP_EMAIL_ID, RPM.WEEK_ENDING, RPM.RSC_HOURS_LOGGED
 FROM vl.rsrc_prjct_hrs_mapping RPM  right outer Join vl.resource  RT ON RT.EMP_ID = RPM.EMP_ID 
 JOIN 
 vl.project PT ON PT.PROJECT_ID=RPM.PROJECT_ID WHERE PT.PROJECT_IRM='TMPT-4854' AND
  PT.PROJECT_DESC='33801-Urgent Care EnhancementEPDS V2' AND 
  RPM.WEEK_ENDING BETWEEN '2018-07-07' AND '2018-08-07';

Но я хочу, чтобы все сотрудники, но конец недели должен прийти, и часы должны быть 0.

Я также попытался использовать следующий запрос:

select RT.EMP_ID,RT.EMP_NAME, RT.EMP_EMAIL_ID,tt.week_ending,tt.RSC_HOURS_LOGGED from vl.resource  RT left outer join (select RPM.EMP_ID,RPM.WEEK_ENDING, RPM.RSC_HOURS_LOGGED from vl.rsrc_prjct_hrs_mapping RPM join vl.project PT ON PT.PROJECT_ID=RPM.PROJECT_ID WHERE PT.PROJECT_IRM='TMPT-4854' AND PT.PROJECT_DESC='33801-Urgent Care EnhancementEPDS V2' AND RPM.WEEK_ENDING BETWEEN '2018-07-07' AND '2018-07-07') tt on RT.EMP_ID = tt.EMP_ID;

Но это дает всех сотрудников в таблице сотрудников, но я хочу, чтобы только сотрудники для конкретного проекта.

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Я не рекомендую использовать right join.Это просто сбивает с толку.Используйте let join - сохраните все строки в первой таблице и соответствующие строки в последующих таблицах.

Итак, если вы хотите сохранить всех сотрудников, начните с этой таблицы:

SELECT RT.EMP_ID, RT.EMP_NAME, RT.EMP_EMAIL_ID, RPM.WEEK_ENDING, RPM.RSC_HOURS_LOGGED
FROM vl.resource RT LEFT JOIN
     vl.rsrc_prjct_hrs_mapping RPM 
     ON RT.EMP_ID = RPM.EMP_ID AND
        RPM.WEEK_ENDING BETWEEN '2018-07-07' AND '2018-08-07' LEFT JOIN 
     vl.project PT
     ON PT.PROJECT_ID = RPM.PROJECT_ID AND
        PT.PROJECT_IRM = 'TMPT-4854' AND
        PT.PROJECT_DESC = '33801-Urgent Care EnhancementEPDS V2' ;

Фильтрация по проекту входит в предложение ON.

Если вы хотите, чтобы в проекте участвовали только те, у кого когда-либо , то вам нужна дополнительная фильтрация.Я думаю, что это будет делать то, что вы хотите:

SELECT RT.EMP_ID, RT.EMP_NAME, RT.EMP_EMAIL_ID, RPM.WEEK_ENDING, RPM.RSC_HOURS_LOGGED
FROM vl.resource RT LEFT JOIN
     vl.rsrc_prjct_hrs_mapping RPM 
     ON RT.EMP_ID = RPM.EMP_ID AND
        RPM.WEEK_ENDING BETWEEN '2018-07-07' AND '2018-08-07' LEFT JOIN 
     vl.project PT
     ON PT.PROJECT_ID = RPM.PROJECT_ID AND
        PT.PROJECT_IRM = 'TMPT-4854' AND
        PT.PROJECT_DESC = '33801-Urgent Care EnhancementEPDS V2'
WHERE EXISTS (SELECT 1
              FROM vl.rsrc_prjct_hrs_mapping RPM2 JOIN
                   vl.project PT2
                   ON PT2.PROJECT_ID = RPM2.PROJECT_ID AND
                      PT2.PROJECT_IRM = 'TMPT-4854' AND
                      PT2.PROJECT_DESC = '33801-Urgent Care EnhancementEPDS V2'
              WHERE RPM2.EMP_ID = RF.EMP_ID 
             );
0 голосов
/ 13 февраля 2019

RIGHT OUTER JOIN с JOIN, преобразованным в INNER JOIN неявно, поэтому правое внешнее объединение здесь не имеет смысла.Измените порядок ваших объединений или сделайте оба из внешнего объединения

Также вам нужно переместить RPM.WEEK_ENDING BETWEEN '2018-07-07' AND '2018-08-07' в ON предложение Right outer join

SELECT 
   RT.EMP_ID,
   RT.EMP_NAME, 
   RT.EMP_EMAIL_ID, 
   RPM.WEEK_ENDING, 
   RPM.RSC_HOURS_LOGGED
FROM vl.rsrc_prjct_hrs_mapping RPM  
right outer Join vl.resource  RT 
  ON RT.EMP_ID = RPM.EMP_ID and
  RPM.WEEK_ENDING BETWEEN '2018-07-07' AND '2018-08-07'
... OUTER JOIN vl.project PT 
  ON PT.PROJECT_ID=RPM.PROJECT_ID  and 
     PT.PROJECT_DESC='33801-Urgent Care EnhancementEPDS V2' AND
     PT.PROJECT_IRM='TMPT-4854'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...