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ď č. 1Musí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