Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come selezionare i record che non esistono in SQL Server

Puoi farlo con un CTE . Qualcosa del genere:

DECLARE @startDate datetime = '2/1/2014'
DECLARE @endDate datetime = '2/6/2014'

;WITH DateRange(RunningDate) AS
(
    SELECT @startDate AS RunningDate
    UNION ALL
    SELECT RunningDate + 1
    FROM DateRange
    WHERE RunningDate < @endDate
)

SELECT id, RunningDate date, value1, value2 
FROM DateRange LEFT JOIN myTable ON myTable.date = DateRange.RunningDate

Modifica... SE scegli questa soluzione (prendi nota del commento di Aaron Bertrand sotto la mia risposta), tieni presente che dovrai anche specificare max ricorsione se intendi affrontare range maggiori di 3 mesi. Il valore predefinito è 100. Ciò significa che, poiché la query è attualmente scritta, eseguirà solo un massimo di 101 date (100 livelli di ricorsione).

Puoi inoltre specificare OPTION (MAXRECURSION 0) alla fine dell'ultimo SELECT per superare questo. 0 significa infiniti livelli di ricorsione. Ma ancora una volta, prendi nota del post di Aaron.