/ / Entendendo várias junções de tabelas do SQL Server - sql-server, join

Noções básicas sobre várias junções de tabelas do SQL Server - sql-server, join

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

Você 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