Od ponad 10 lat nie używam SQL-a i mam problem z zapytaniem.
Potrzebuję pobrać KntKarty z wartością jednego atrybutu o nazwie ZEWNID. Jeśli KntKarty nie ma atrybutu to ma być w wyniku z pustą wartością atrybutu ZEWNID.
Takie zapytanie zwraca oczywiście tylko kontrahenta, który ma atrybut i wartość
SELECT CDN.KntKarty.*, CDN.Atrybuty.Atr_Wartosc as ZewnId
FROM
CDN.KntKarty
inner join CDN.Atrybuty ON CDN.KntKarty.Knt_GIDNumer = CDN.Atrybuty.Atr_ObiNumer
inner join CDN.AtrybutyKlasy ON CDN.Atrybuty.Atr_AtkId = CDN.AtrybutyKlasy.AtK_ID
WHERE (CDN.AtrybutyKlasy.AtK_Nazwa = 'ZEWNID')
SELECT K.*,
A.Atr_Wartosc as ZewnId
FROM
CDN.KntKarty as K
LEFT join CDN.Atrybuty as A ON Knt_GIDNumer = Atr_ObiNumer and Atr_AtkId = (select AtK_ID from CDN.AtrybutyKlasy where AtK_Nazwa = 'ZewnId')
SELECT CDN.KntKarty.*,
(SELECT TOP 1 Atr_Wartosc FROM CDN.Atrybuty JOIN CDN.AtrybutyKlasy ON
Atr_AtkId=Atk_id WHERE
Atr_ObiTyp=Knt_GidTyp AND Atr_ObiNumer=Knt_GidNumer AND
Atk_Nazwa='ZewnId'
) as ZewnId
FROM
CDN.KntKarty
Oczywiście tylko dla tego przypadku, bo atrybuty mogą być wielowartościowe i takie zapytanie nie zda egzaminu. Możesz jeszcze obudować podzapytanie ISNULL.