Eu preciso de um esclarecimento sobre como várias junções funcionam no SQL Server.
Tenho 4 tabelas, digamos Tabela A, Tabela B, Tabela C, Tabela D. Todas estão inter-relacionadas (A-B-C-D).
Tabela A e B formam parte de um grupo (Fatura) e Tabela B e C outro (Ordem)
Tabela A tem 100 registros, B tem 90, C tem 60 e D tem 70.
A relação entre A e B é um para muitos relacionamentos. A- = B, e individualmente eu quero Inner juntá-los (como eles fazem parte da fatura)
D é interno junto com C tendo um para muitos relacionamento. C = -D e individualmente eu quero Inner juntá-los (como eles são parte de Ordens)
Relação entre B e C é um para um e euquer Esquerda Junte-se a eles. ou seja, todos os registros de B e Null em registros ausentes de C. Ao mesmo tempo, junte todas as tabelas. Então, eu quero um total de 90 registros (todos da tabela B e Null onde eles não estão presentes)
A-=B--C=-D
Meu entendimento era que eu poderia usar o seguinte código.
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
No entanto, isso parece produzir resultado incorreto. Eu tenho 70 registros. Depois de manter a junção entre C e D, ou seja, a última junção na consulta uma junção esquerda, obtive 100 registros.
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
Por que isso está acontecendo e qual é a maneira correta de obter 90 registros, ou seja, todos os registros da tabela B e Null estão sempre ausentes.
Respostas:
1 para resposta № 1Você terá que fazer a junção entre C e D em uma subconsulta, então junte-o a B. Algo como isto:
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
Você não pode ter equijoin, em seguida, junte-se à esquerda, em seguida, equijoin através de relações sem sintaxe entre parênteses (ou aninhados) no SQL.
0 para resposta № 2
Tente algo assim, parece que a Tabela B é a sua mesa base e não a Tabela 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 para resposta № 3
Você pode estar procurando por isso
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