Mistrzem sql'a nie jestem i pewnie można zrobić to lepiej.
SELECT * FROM tablica1 t1
JOIN tablica2 t2 ON t1.id = t2.id
WHERE t1.DO NOT BETWEEN t2.urlop_od AND t2.urlop_do
Twoje rozwiązanie nie dość, że zwróci potencjalnie wszystkie rekordy z pierwszej tabeli, to na dodatek zwróci je wielokrotnie.
Cześć,
Bardzo proszę o pomoc. Mam dwie poniższe tablice. Jak prawidłowo napisać zapytanie najlepiej w t-sql aby w tablicy 1 pozostały tyle te rekordy, które nie pokrywają się z datą z tablicy 2 ?. tzn. Jeśli w tablicy 1 np. w ostatnim wierszu mam daty od 2021-01-01 do 2021-02-13 to trzeba sprawdzic czy w tym terminie pracownik był na urlopie. Jeżeli było chociaż jeden dzień to taki rekord w wyniku końcowym nie powinien się pojawić.
Zanim przejdziemy do rozwiązania, polecam oduczyć się nazywania tabel i kolumn z wykorzystaniem spacji - nie jest to błędne, ale utrudnia życie wymuszając stosowanie nawiasów kwadratowych.
Z Twojego opisu wnioskuję, że chcesz zrobić jedną z dwóch rzeczy: pobrać z jednej tabeli wszystkie rekordy, które nie pokrywają się okresami z drugą tabelą, ALBO usunąć z jednej tabeli wszystkie rekordy, które się z drugą tabelą pokrywają.
SELECT *
FROM [1 tablica] t1
WHERE NOT EXISTS (
SELECT *
FROM [2 TABLICA] t2
WHERE t2.[id pracownika]=t1.[id pracownika]
AND (
t2.[urlop od] BETWEEN t1.od AND t1.do
or t2.[urlop do] BETWEEN t1.od AND t1.do
or t1.od BETWEEN t2.[urlop od] AND t2.[urlop do]
or t1.do BETWEEN t2.[urlop od] AND t2.[urlop do]
)
)
DELETE
FROM [1 tablica] t1
WHERE EXISTS (
SELECT *
FROM [2 TABLICA] t2
WHERE t2.[id pracownika]=t1.[id pracownika]
AND (
t2.[urlop od] BETWEEN t1.od AND t1.do
or t2.[urlop do] BETWEEN t1.od AND t1.do
or t1.od BETWEEN t2.[urlop od] AND t2.[urlop do]
or t1.do BETWEEN t2.[urlop od] AND t2.[urlop do]
)
)