/ / Pochopenie viacerých pripojení tabuľky SQL Server - sql-server, pripojiť

Pochopenie viacerých pripojení tabuľky SQL Server - sql-server, join

Potrebujem nejaké objasnenie o tom, ako fungujú viaceré pripojenia v SQL Serveri.

Mám 4 tabuľky, povedzme tabuľka A, tabuľka B, tabuľka C, tabuľka D. Všetky sú vzájomne prepojené (A-B-C-D).

Tabuľka A a B tvoria súčasť skupiny (Faktúra) a tabuľky B a C inej (Poradie)

Tabuľka A má 100 záznamov, B má 90, C má 60 a D má 70.

Vzťah medzi A a B je jeden až veľa vzťahov. A- = B a individuálne chcem, aby sa k nim pripojil (ako súčasť faktúry)

D je vnútorný spojený s C, ktorý má jeden až veľa vzťahov. C = -D a individuálne chcem, aby sa k nim pripojil (ako sú súčasťou objednávok)

Vzťah medzi B a C je jeden k jednému a jachcete zostať v spojení s nimi. to znamená všetky záznamy z B a Null v chýbajúcich záznamoch C. Súčasne sa pripojte k všetkým tabuľkám. Takže chcem celkom 90 záznamov (všetky z tabuľky B a Null, kde nie sú prítomné)

A-=B--C=-D

Pochopil som, že môžem použiť nasledujúci kód.

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

Zdá sa však, že to prináša nesprávny výsledok. Mám 70 záznamov. Po udržaní spojenia medzi C a D, t. J. Posledného spojenia v dotaze ľavého spojenia, získam 100 záznamov.

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

Prečo sa to deje a aký je správny spôsob získania 90 záznamov, t. J. Všetkých záznamov z tabuľky B a Null, kde chýba.

odpovede:

1 pre odpoveď č. 1

Musíte urobiť spojenie medzi C a D v poddotáde a potom sa pripojiť k B. Niečo takéto:

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

Nemôžete mať equijoin potom vľavo spojiť a potom equijoin cez vzťahy bez parenthetical (alebo vnorené) syntaxe v SQL.


0 pre odpoveď č. 2

Skúste niečo ako toto, zdá sa, že tabuľka B je vaša základná tabuľka a nie tabuľka 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 pre odpoveď č. 3

Možno ste to hľadali

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