Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak wybrać rekordy, które nie istnieją na serwerze SQL?

Możesz to zrobić za pomocą rekurencyjnego CTE . Coś takiego:

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

Edytuj... JEŚLI zdecydujesz się na to rozwiązanie (zwróć uwagę na komentarz Aarona Bertranda pod moją odpowiedzią), pamiętaj, że będziesz musiał również określić maksymalna rekurencja jeśli zamierzasz radzić sobie z zakresami dłuższymi niż 3 miesiące. Wartość domyślna jest ustawiona na 100. Oznacza to, że ponieważ zapytanie jest obecnie napisane, wykona tylko maksymalnie 101 dat (100 poziomów rekursji).

Możesz dodatkowo określić OPTION (MAXRECURSION 0) na końcu ostatniego SELECT by to przezwyciężyć. 0 oznacza nieskończone poziomy rekurencji. Ale znowu, zwróć uwagę na post Aarona.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak włączyć przechwytywanie zmian danych (CDC) w bazie danych w programie SQL Server — samouczek dotyczący programu SQL Server

  2. SQL Server - Zaokrąglaj wartości TIME do następnej minuty

  3. SQL :usuń ostatni przecinek w łańcuchu

  4. SQL Server:przekonwertuj ((int)rok,(int)miesiąc,(int)dzień) na Datetime

  5. Automatyzacja zadań tworzenia kopii zapasowych i konserwacji za pomocą planu konserwacji w SQL Server