How to Select records that don't exist in Sql Server

后端 未结 3 1019
醉梦人生
醉梦人生 2020-12-19 18:53

This isn\'t about checking if a record exists before selecting it, or viceversa.

The issue is this, I have a database with many records, they are stored by date, by

3条回答
  •  伪装坚强ぢ
    2020-12-19 19:17

    This should work:

    WITH
        -- Numbers CTE, courtesy Itzik Ben-Gan
      L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
      L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
      L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
      L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
      L4   AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
      Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS n FROM L4),
        -- Turn into Dates
      Dates AS(SELECT CAST('18991231' AS DATETIME)+n AS d FROM Nums)
    SELECT * 
    FROM Dates d
    LEFT JOIN myTable t ON d.d = t.[date]
    WHERE d.d>='02/01/2014' AND d.d<='02/03/2014'
    

    Here is a version that is optimized for smaller date ranges:

    DECLARE @startDate datetime = '2/1/2014'
    DECLARE @endDate datetime = '2/3/2014'
    DECLARE @days as INT = DATEDIFF(dd, @startDate, @enddate) + 1
    ;
    WITH
        -- Numbers CTE, courtesy Itzik Ben-Gan
      L0   AS(SELECT 1 AS c UNION ALL SELECT 1),
      L1   AS(SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
      L2   AS(SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
      L3   AS(SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
      L4   AS(SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
      T4   AS(SELECT TOP (@days) 1 AS c FROM L4),
      Nums AS(SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL))-1 AS n FROM T4),
        -- Turn into Dates
      Dates AS(SELECT @startDate+n AS d FROM Nums)
    SELECT * 
    FROM Dates d
    LEFT JOIN myTable t ON d.d = t.[date]
    WHERE d.d>=@startDate AND d.d<=@endDate
    

提交回复
热议问题