T-SQL join do innej tabeli jeśli w jednej nie istnieje

0

Cześć

W swoim zapytaniu potrzebuję wyciągnać adresy pracowników. Mam osobne tabele z pracownikami, umowami, adresami.
Algorytm wygląda w ten sposób: Jeśli możemy połączyć pracownika bezpośrednio z adresami i adres istnieje to wówczas zwracamy ten adres w zapytaniu. Jeśli zaś adres jest nullowy to powinniśmy pójść od pracownika, przez umowę i wtedy do adresu.
Ja zrobiłem to na zasadzie kilku joinów oraz case when

select 
 pr.Imie, pr.Nazwisko,
 case when a.KodPocztowy is null then au.KodPocztowy else a.KodPocztowy end as KodPocztowy
from pracownicy pr
left join adresy a
 on a.pracownikid = pr.Id
left join umowy u
 on u.pracownikid = pr.id
left join adresy au
 on au.umowaid = u.id

Niestety w ten sposób dostaje zdublowane rekordy (np dwa razy Jan Kowalski który raz ma null w kodzie pocztowym, a pod nim ponownie Jan Kowalski który ma poprawny kod pocztowy powiazany po umowie. Zastanawiam się jak rozwiązać ten problem

0

Pewno wystarczy dodać GROUP BY - ewentualnie DISTINCT i będzie ok.

Pytanie czemu duble się pojawiają ? Czy 1 pracownik może mieć kilka umów ? Np od do ? Nie powinieneś zawęzić tam danych do aktualnie ważnej umowy (wtedy zakładam powinna być tylko 1) ?

0

Masz zdublowane bo pracownik ma pewnie więcej niż jedną umowę, najprościej zrobić table powiązań i pobrać "pierwszy" adres:
Coś w ten deseń

with pra as (
Select 
	ROW_NUMBER() over (partition by pracownikid order by o) r
	,adresid
	,pracownikid
from (
		select 
			0 o
			, a.id adresid
			, a.pracownikid 
		from 
			adresy a
		union all
		select 
			1 o
			, au.id
			, u.pracownikid 
		from 
			umowy u 
			left join adresy au on au.umowaid = u.id) dt
)

select 
	pr.Imie
	, pr.Nazwisko
	,a.KodPocztowy 
from 
	pracownicy pr
	left join pra on pra.pracownikid = pra.id and pra.r=1
	left join adresy a on a.pracownikid = pra.pracownikId and a.id = pra.adresid
0

jak wyżej, źle się wyraziłem, nie chodzi o duble ale o to że pojawiają się także rekordy z nullami przykładowo mogę mieć dwa razy Jana Kowalskiego gdzie raz będzie mieć w kodzie pocztowym null i pod nim taki sam rekord z kodem pocztowym powiązanym po umowie

Odpowiadaj w postach!

Z tego opisu nic nie wynika, skoro masz ten sam rekord raz z nullem, raz bez to do pracownika moży być przypisany adres z nullowym kodem a do umowy inny adres z wypełnionym kodem, lub mieć dwa rózne adresy na umowach raz z kodem raz bez.

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