单个SQL查询以获取任务状态

时间:2017-08-14 21:00:45

标签: sql sql-server join

我很感激社区可以提供的任何帮助,帮助我编写SQL查询来实现以下目标,或者,如果不可能,提供一种方法来实现。

目标:返回如下结果:

subtaskID | subtaskQueueID | subtaskName | timeComplete        | jobID | approver 
--------- | -------------- | ----------- | ------------------- | ------| --------
23        | 2              | Review #1   | 2017-08-14 00:00:00 | 840   | Bill
24        | 2              | Review #2   | 2017-08-14 01:00:00 | 840   | John
25        | 2              | Review #3   | NULL                | 840   | NULL
26        | 2              | Review #4   | NULL                | 840   | NULL

源表:

Job_subtasks_status

jobID | subtaskID    | timeComplete        | approver
----- | ------------ | ------------------- | --------
840   | 23           | 2017-08-14 00:00:00 | Bill
840   | 24           | 2017-08-14 01:00:00 | John

Job_subtasks

subtaskID | subtaskQueueID | subtaskName
--------- | -------------- | -----------
23        | 2              | Review #1
24        | 2              | Review #2
25        | 2              | Review #3
26        | 2              | Review #4
27        | 4              | Funding Approval
28        | 4              | Requirement Approval

需要注意的重要一点是,我希望在jobaskubueID = 2时返回Job_subtasks中的所有记录,如果Job_subtasks_status中没有记录则返回NULL(NULL表示子任务未完成)。

我认为标准LEFT JOIN会这样做,所以我尝试了以下查询:

SELECT A.subtaskID, A.subtaskQueueID, A.subtaskName, B.timeComplete, B.jobID, B.approver 
FROM Job_subtasks A LEFT JOIN Job_subtasks_status B ON A.subtaskID=B.subtaskID 
WHERE B.subtaskID=2 AND B.jobID=840

3 个答案:

答案 0 :(得分:0)

您的WHERE子句会过滤掉NULL的{​​{1}}结果(LEFT JOIN执行 WHERE后)。

将这些条件添加到OUTER JOIN子句:

ON

答案 1 :(得分:0)

left join second 表的条件应该放在on子句中:

SELECT js.subtaskID, js.subtaskQueueID, js.subtaskName,
       jss.timeComplete, jss.jobID, jss.approver 
FROM Job_subtasks js LEFT JOIN
     Job_subtasks_status jss
     ON js.subtaskID = jss.subtaskID AND jss.subtaskID = 2 AND jss.jobID = 840;

我还强烈建议您使用有意义的表别名。

为什么条件会去那里? left join保留第一个表中的所有行以及第二个表中的匹配行。如果没有匹配项,则第二个表中的列为NULL - WHERE子句将其过滤掉。

答案 2 :(得分:0)

您可以尝试使用LEFT OUTER JOIN。这将返回来自{Job_subtasks»表subtaskQueueID=2

的所有值
Select     A.subtaskID, 
           A.subtaskQueueID, 
           A.subtaskName, 
           B.timeComplete, 
           B.jobID, 
           B.approver 
From       Job_subtasks        A 
Left Outer Join Job_subtasks_status B  On  A.subtaskID = B.subtaskID 
                                  And B.subtaskID = 2 
                                  And B.jobID = 840

结果应为:

subtaskID | subtaskQueueID | subtaskName | timeComplete        | jobID | approver 
--------- | -------------- | ----------- | ------------------- | ------| --------
23        | 2              | Review #1   | 2017-08-14 00:00:00 | 840   | Bill
24        | 2              | Review #2   | 2017-08-14 01:00:00 | 840   | John
25        | 2              | Review #3   | NULL                | 840   | NULL
26        | 2              | Review #4   | NULL                | 840   | NULL