2016-11-10 108 views
1

我无法连接两次相同的表,因为返回的结果完全不正确。SQL查询 - 多个连接

下面的查询工作得很好。但是,我想更改它,以便使用Requirement Traced To列中返回的值返回Requirement Type的额外列。

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 

当我第二次用不同的别名添加REQREQ_TYPE表我得到数百行返回28我期待的不是。

任何帮助,将不胜感激。

+2

请勿混用旧式逗号明确连接分离的联接。这太混乱了。 – jarlh

+2

您已经在选择这两列。你真的想做什么? –

+0

我想返回REQ表中的所有行,然后将REQ.RQ_REQ_ID和REQ_TRACE.RT_FROM_REQ_ID之间的匹配项加到REQ_TRACE表中。 对于匹配的行,我想要通过REQ_RYPE表返回两个列R.RQ_REQ_ID和RTR.RT_TO_REQ_ID的需求类型。使用RTR.RT_TO_REQ_ID到REQ表的第二次连接是令我困惑的。 – Gray

回答

1

决不使用逗号。 总是使用明确的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's。 – MatBailie

+0

@戈登非常感谢。正是我在找什么。 – Gray

0

您需要使用两个join不是编写表名后加入的条件与逗号:在FROM子句中

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,谢谢你的回复。我刚刚更新了我的回答 –