Proszę o pomoc w napisaniu zapytania T-SQL

0

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ć.
screenshot-20220621190709.png

screenshot-20220621190838.png

46

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
2
ledi12 napisał(a):

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.

arkadiusz855 napisał(a):

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]
		)
)
0

Bardzo dziękuję za pomoc. Super :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1