Potrzebuję wyjaśnienia, jak działa wiele złącz w SQL Server.
Mam 4 tabele, powiedzmy Tabela A, Tabela B, Tabela C, Tabela D. Wszystkie są ze sobą powiązane (A-B-C-D).
Tabela A i B stanowią część grupy (Faktura) oraz Tabela B i C inna (Zamówienie)
Tabela A ma 100 rekordów, B ma 90, C ma 60, a D ma 70.
Relacja między A i B jest relacją jeden do wielu. Dołącz do nich A- = B i indywidualnie chcę Inner (ponieważ są częścią faktury)
D jest wewnętrznie połączony z C mającym jeden do wielu związków. C = -D i indywidualnie chcę Inner dołączyć do nich (ponieważ są częścią Zamówienia)
Związek między B i C jest jeden do jednego, a jachce się z nimi połączyć. tj. wszystkie rekordy z B i Null w brakujących zapisach C. W tym samym czasie dołącz wszystkie tabele. Chcę więc mieć 90 rekordów (wszystkie z tabeli B i Null, gdzie nie są obecne)
A-=B--C=-D
Zrozumiałem, że mogę użyć następującego kodu.
SELECT *
FROM Table A AS A
INNER JOIN Table B AS B ON A.id = B.id
LEFT JOIN Table C AS C ON B.Cid = C.Cid AND B.key = C.key
INNER JOIN Table D AS D ON C.Did = D.Did
Wydaje się jednak, że daje to błędny wynik. Mam 70 rekordów. Po utrzymaniu połączenia między C i D, tj. Ostatnim połączeniem w zapytaniu lewe sprzężenie, otrzymałem 100 rekordów.
SELECT *
FROM Table A AS A
INNER JOIN Table B AS B ON A.id = B.id
LEFT JOIN Table C AS C ON B.Cid = C.Cid AND B.key = C.key
LEFT JOIN Table D AS D ON C.Did = D.Did
Dlaczego tak się dzieje i jaki jest właściwy sposób uzyskania 90 rekordów, tj. Wszystkich rekordów z tabeli B i Null, gdzie nigdy nie brakuje.
Odpowiedzi:
1 dla odpowiedzi № 1Musisz utworzyć połączenie między C i D w podzapytaniu, a następnie dołączyć je do B. Coś takiego:
SELECT *
FROM Table A AS A
INNER JOIN Table B AS B ON A.id = B.id
LEFT JOIN (
SELECT C.Cid, C.key
FROM Table C AS C
JOIN Table D AS D ON C.Did = D.Did ) AS CD ON B.Cid = CD.Cid AND B.key = CD.key
Możesz nie mieć equijoin, a następnie left join, a następnie equijoin między relacjami bez składni w nawiasach (lub zagnieżdżonej) w SQL.
0 dla odpowiedzi nr 2
Spróbuj czegoś takiego, wygląda na to, że tabela B jest Twoją tabelą bazową, a nie tabelą A
SELECT *
FROM Table B AS B
INNER JOIN Table A AS A ON B.id = A.id
LEFT JOIN (
SELECT C.Cid, C.key
FROM Table C AS C
INNER JOIN Table D AS D ON C.Did = D.Did ) AS CD ON B.Cid = CD.Cid AND B.key = CD.key
0 dla odpowiedzi № 3
Może tego szukasz
SELECT *
FROM Table A AS A
INNER JOIN Table B AS B
ON A.id = B.id
LEFT JOIN Table C AS C
INNER JOIN Table D AS D
ON C.Did = D.Did
ON B.Cid = C.Cid
AND B.key = C.key