Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

So wählen Sie Datensätze aus, die in Sql Server nicht vorhanden sind

Sie könnten dies mit einem rekursiven CTE . Etwa so:

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

Bearbeiten... Wenn Sie sich für diese Lösung entscheiden (beachten Sie den Kommentar von Aaron Bertrand unter meiner Antwort), beachten Sie, dass Sie auch maximale Rekursion wenn Sie beabsichtigen, mit Reichweiten von mehr als 3 Monaten umzugehen. Der Standardwert ist auf 100 eingestellt. Dies bedeutet, dass die Abfrage, wie sie derzeit geschrieben ist, nur maximal 101 Daten (100 Rekursionsebenen) verarbeitet.

Sie können zusätzlich OPTION (MAXRECURSION 0) angeben am Ende des letzten SELECT um dies zu überwinden. 0 bedeutet unendliche Rekursionsebenen. Beachten Sie aber noch einmal Aarons Beitrag.