如何从一个表中获取所有记录,仅从连接表中获取具有条件的记录

时间:2014-04-04 15:52:09

标签: sql sql-server join

似乎我之前已经完成了这项工作,但再次陷入困境。这是我的数据:

tblHotlist
----------
ID
hotlistStatus
buildNumber
loadType
etc

tblessr
-------
ID
esHeadline
notesStatus
actionItems
bugStatusID
etc

tblBugStatus (not needed in query)
------------
ID
bugStatus
etc

tbl_j_hlbug
-----------
esID
hotlistID
timestamp

我想要来自tblHotlist的所有记录,如果记录存在于tblESSR中,我需要那些bugStatusID = 300的记录。我尝试了几种不同的连接和子查询,但仍然无法得到我需要的结果。一旦我把bugStatusID = 300的限定符,我只从tblHotlist获取记录,其中来自tblESSR的记录的bugStatusID为300.

尝试失败:

SELECT hl.hotlistID, hl.buildnumber, es.ID, es.notesStatus, es.actionItems
FROM tblhotList hl
     LEFT OUTER JOIN tbl_j_hlbug j ON j.hotlistID = hl.id
     LEFT OUTER JOIN tblESSR es ON j.esrID = es.id
WHERE hl.hotlistStatusID=100 AND hl.loadType='su' AND es.bugStatusID=300

任何帮助将不胜感激。我尝试了不同的连接和几个子查询,但我总是得到相同的结果。

谢谢!

2 个答案:

答案 0 :(得分:2)

由于连接,在WHERE之前的一些结果集在bugStatusID中将为NULL,因此如果您希望看到这些结果,则需要将其添加到您的位置。

SELECT hl.hotlistID, hl.buildnumber, es.ID, es.notesStatus, es.actionItems
FROM tblhotList hl
     LEFT OUTER JOIN tbl_j_hlbug j ON j.hotlistID = hl.id
     LEFT OUTER JOIN tblESSR es ON j.esrID = es.id
WHERE hl.hotlistStatusID=100 AND hl.loadType='su' AND (es.bugStatusID=300  OR es.bugStatusID IS NULL)

答案 1 :(得分:1)

您必须将限制条件移动到连接,或者还要查找空值。

WHERE hl.hotlistStatusID=100 AND hl.loadType='su' AND 
(es.bugStatusID=300 or es.bugStatusID is null)

当外部联接发生时,您必须考虑在没有匹配数据的记录上存在空值。因此,如果您尝试通过这些限制,最终将排除没有匹配数据的空值;从而否定了外连接。有时这就是你想要的......有时它不是。在这种情况下,我认为你想要空值和300。

SELECT hl.hotlistID, hl.buildnumber, es.ID, es.notesStatus, es.actionItems
FROM tblhotList hl
     LEFT OUTER JOIN tbl_j_hlbug j ON j.hotlistID = hl.id
     LEFT OUTER JOIN tblESSR es 
        ON j.esrID = es.id
       AND es.bugStatusID=300
WHERE hl.hotlistStatusID=100 AND hl.loadType='su' 

Hl where子句并不重要,因为您开始获取所有记录。