2014-02-18 19 views
0
SELECT 
    [dbo].[Mission].[MissionId] 
FROM 
    [dbo].[Mission] 
LEFT OUTER JOIN 
    [dbo].[Report] ON [dbo].[Mission].[MissionId] = [dbo].[Report].[MissionId] 
WHERE 
    [dbo].[Report].ReportDate IS NULL 
ORDER BY 
    [dbo].[Mission].[MissionId] 

如何更改上面的查詢,使得它讓我從表[dbo].[Mission]所有MissionId的沒有表[dbo].[Report]一行今天的[dbo].[Report].ReportDate是什麼?獲取子表中沒有當前日期行的所有父行?

MissionId是表Mission中的主鍵和表Report中的外鍵。所以我想要得到當前日期的所有沒有排在Report的任務。

回答

4

我已經介紹了一些別名,使查詢更容易閱讀,並添加了所需的條件。我也改變了WHERE條款,不知道這是必需的:

SELECT m.[MissionId] 
FROM [dbo].[Mission] m LEFT OUTER JOIN [dbo].[Report] r 
    ON m.[MissionId] = r.[MissionId] 
    AND r.ReportDate = DATEADD(day,DATEDIFF(day,0,GETDATE()),0) 
WHERE r.MissionId IS NULL 
ORDER BY m.[MissionId] 

這假定ReportDate包含設置爲午夜時間部分日期。如果不是這樣,那麼一個稍微複雜的查詢要求:

SELECT m.[MissionId] 
FROM [dbo].[Mission] m 
WHERE NOT EXISTS(select * from dbo.Report r 
       where r.MissionID = m.MissionID and 
        r.ReportDate >= DATEADD(day,DATEDIFF(day,0,GETDATE()),0) and 
        r.ReportDate < DATEADD(day,DATEDIFF(day,0,GETDATE()),1) 
       ) 
ORDER BY m.[MissionId] 

GETDATE()返回當前的日期和時間。我使用了DATEADDDATEDIFF中的一些技巧來獲取該值,並在午夜將其轉換爲當前日期,並且(在第二個查詢中)明天的午夜時間。


第二查詢作爲完全可運行查詢:

declare @mission table (MissionID int not null); 
insert into @mission (MissionID) select 1 union all select 2; 
declare @report table (MissionID int not null,ReportDate datetime not null); 
insert into @report (MissionID,ReportDate) 
select 2,GETDATE() union all select 1,DATEADD(day,-1,GETDATE()); 

SELECT m.[MissionId] 
FROM @mission m 
WHERE NOT EXISTS(select * from @report r 
       where r.MissionID = m.MissionID and 
        r.ReportDate >= DATEADD(day,DATEDIFF(day,0,GETDATE()),0) and 
        r.ReportDate < DATEADD(day,DATEDIFF(day,0,GETDATE()),1) 
       ) 
ORDER BY m.[MissionId] 

結果:

MissionId 
----------- 
1 
+0

+1從我來說,這看起來不錯。 –

+0

進一步測試,選項2沒有任何行。任何想法爲什麼? – StackTrace

+0

@ SQL.NETWarrior - 如果您可以用一些示例數據設置[sqlfiddle](http://sqlfiddle.com/),或者將一些示例數據添加到您的問題和預期結果中,您將得到完全測試的查詢。事實上,我只能編制它的工作數據。我在答案的底部添加了完整的repro腳本。 –

0
select 
    m.MissionId 
from Mission m 
left join Report r 
    on m.MissionId = r.MissionId 
    and day(r.ReportDate) = day(getdate()) 
    and month(r.ReportDate) = month(getdate()) 
    and year(r.ReportDate) = year(getdate()) 
WHERE r.ReportDate is null 
ORDER BY m.MissionId 
相關問題