2016-11-10 4 views
1

У меня возникли трудности с объединением одних и тех же таблиц, из-за которых возвращаемые результаты полностью неверны.SQL Query - множественные объединения

Приведенный ниже запрос работает очень хорошо. Однако я хочу изменить его так, чтобы я мог вернуть дополнительный столбец Requirement Type, используя значение, возвращаемое в столбце Requirement Traced To.

SELECT R.RQ_REQ_ID  as "Requirement Traced From", 
      R.RQ_REQ_NAME as "Requirement Name", 
      RTY.TPR_NAME  as "Requirement Type", 
      RTR.RT_TO_REQ_ID as "Requirement Traced To" 
FROM  REQ R 
LEFT JOIN REQ_TRACE RTR 
ON  R.RQ_REQ_ID = RTR.RT_FROM_REQ_ID, Req_Type RTY 
WHERE  R.RQ_TYPE_ID = RTY.TPR_TYPE_ID 
AND  RTY.TPR_NAME in ('TOM', 'Business Process Map', 'Work Instruction', 'Functional', 'Customer Journey', 'Business') 
ORDER BY 1 

Когда я добавляю REQ и REQ_TYPE таблицы во второй раз с различными псевдонимами я получаю сотни строк, возвращенных вместо 28 я ожидал.

Любая помощь будет оценена по достоинству.

+2

Не смешивать явно присоединяется старый стиль разделенные запятой соединения. Это просто слишком запутанно. – jarlh

+2

Вы уже выбрали эти два столбца. Что вы действительно хотите сделать? –

+0

Я хочу вернуть все строки из таблицы REQ и затем присоединиться к таблице REQ_TRACE, где есть соответствие между REQ.RQ_REQ_ID и REQ_TRACE.RT_FROM_REQ_ID. Для строк, которые соответствуют, я хочу вернуть Тип требования для столбцов R.RQ_REQ_ID и RTR.RT_TO_REQ_ID, который находится в таблице REQ_RYPE. Второе соединение с использованием RTR.RT_TO_REQ_ID в таблице REQ - это то, что меня сбивает с толку. – Gray

ответ

1

Никогда использовать запятые в предложении FROM. Всегда использовать явно JOIN синтаксис.

Вам нужно добавить дополнительный присоединяется так:

SELECT R.RQ_REQ_ID  as "Requirement Traced From", 
     R.RQ_REQ_NAME as "Requirement Name", 
     RTY.TPR_NAME  as "Requirement Type", 
     RTR.RT_TO_REQ_ID as "Requirement Traced To", 
     RTY2.TPR_NAME as "Requirement Type To", 
FROM REQ R LEFT JOIN 
    REQ_TRACE RTR 
    ON R.RQ_REQ_ID = RTR.RT_FROM_REQ_ID LEFT JOIN 
    Req_Type RTY 
    ON R.RQ_TYPE_ID = RTY.TPR_TYPE_ID LEFT JOIN 
    REQ R R2 
    ON R2.RQ_REQ_ID = RTR.RT_TO_REQ_ID LEFT JOIN 
    Req_Type RTY2 
    ON RTY2.TPR_TYPE_ID = R2.RQ_TYPE_ID 
WHERE RTY.TPR_NAME in ('TOM', 'Business Process Map', 'Work Instruction', 'Functional', 'Customer Journey', 'Business') 
ORDER BY 1; 
+0

Предложение 'WHERE' отменяет первые два' LEFT JOIN', возвращая их в 'INNER JOIN'. – MatBailie

+0

@Gordon Большое спасибо. Именно то, что я искал. – Gray

0

Вы должны использовать два join вместо написания имени таблицы после того, как условие соединения с запятой:

SELECT R.RQ_REQ_ID  as "Requirement Traced From", 
     R.RQ_REQ_NAME as "Requirement Name", 
     RTY.TPR_NAME  as "Requirement Type", 
     RTR.RT_TO_REQ_ID as "Requirement Traced To" 
FROM  REQ R 
LEFT JOIN REQ_TRACE RTR 
ON  R.RQ_REQ_ID = RTR.RT_FROM_REQ_ID 
LEFT JOIN Req_Type RTY 
ON R.RQ_TYPE_ID = RTY.TPR_TYPE_ID 
    and RTY.TPR_NAME in ('TOM', 'Business Process Map', 'Work Instruction', 'Functional', 'Customer Journey', 'Business') 
ORDER BY 1 
+0

Предложение 'WHERE' должно быть частью' LEFT JOIN'. В противном случае вы вернетесь к 'INNER JOIN' * (потому что' WHERE' применяется после 'LEFT JOIN', и в этот момент поля могут быть' NULL') *. – MatBailie

+0

@MatBailie, спасибо за ответ. Я только что обновил свой ответ –

Смежные вопросы