/ / Zrozumienie łączenia wielu tabel SQL Server - sql-server, join

Omówienie łączenia wielu tabel SQL Server - sql-server, join

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 № 1

Musisz 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