【问题标题】:Get all parent rows that do not have a row for current date in child table?获取子表中当前日期没有行的所有父行?
【发布时间】:2014-02-18 07:30:06
【问题描述】:
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] 中没有行的表 [dbo].[Report] 中的所有 MissionId,其中 [dbo].[Report].ReportDate 是今天的行?

MissionId 是表 Mission 中的主键和表 Report 中的外键。所以我想获取当前日期表Report 中没有一行的所有任务。

【问题讨论】:

    标签: sql-server tsql sql-server-2005


    【解决方案1】:

    我引入了一些别名以使查询更易于阅读,并添加了所需的条件。我还更改了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
    

    【讨论】:

    • 在进一步测试中,选项 2 没有任何行。知道为什么吗?
    • @SQL.NETWarrior - 如果您可以使用一些示例数据设置sqlfiddle,或者将一些示例数据添加到您的问题和预期结果中,您将获得经过全面测试的查询。事实上,我只能弥补它适用的数据。我在答案的底部添加了一个完整的复制脚本。
    • @Damien_The_Unbeliever 哦,对不起,我做错了一件事。它有效。
    【解决方案2】:
    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
    

    【讨论】:

      猜你喜欢
      • 2020-05-29
      • 1970-01-01
      • 2012-07-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多