Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como selecionar registros que não existem no Sql Server


Você pode fazer isso com um CTE . Algo assim:
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

Editar... SE você optar por esta solução (observe o comentário de Aaron Bertrand na minha resposta), observe que você também precisará especificar o recursão máxima se pretende lidar com intervalos superiores a 3 meses. O padrão é definido como 100. Isso significa que, como a consulta está atualmente gravada, ela só fará no máximo 101 datas (100 níveis de recursão).

Você também pode especificar OPTION (MAXRECURSION 0) no final do último SELECT para superar isso. 0 significa níveis infinitos de recursão. Mas, novamente, tome nota do post de Aaron.