Fonte: www.activedelphi.com.br
Para aqueles que tinham dúvidas quanto ao funcionamento dos JOIN's das tabelas no SQL, desenvolvi um pequeno tutorial de apoio...
Tabelas e seus registros:
TABELA_A
Codigo | Nome |
1 | um |
2 | dois |
3 | três |
4 | quatro |
5 | cinco |
TABELA B
Lanca | Codigo | Valor |
1 | 1 | 1.000 |
2 | 1 | 2.000 |
3 | 1 | 5.000 |
4 | 2 | 4.000 |
5 | 2 | 9.000 |
6 | 3 | 7.000 |
7 | 5 | 4.000 |
8 | 8 | 7.000 |
Para a relação entre as tabelas temos:
3 registros para a empresa 1 (que existe na tabela de empresas);
2 registros para a empresa 2 (que existe na tabela de empresas);
1 registros para a empresa 3 (que existe na tabela de empresas);
0 registros para a empresa 4 (que existe na tabela de empresas);
1 registros para a empresa 5 (que existe na tabela de empresas);
1 registros para a empresa 8 (que NÃO existe na tabela de empresas);
Agora vamos ver como ficariam as pesquisas* (SELECT's) com os JOIN's ( INNER, [ LEFT | RIGHT | FULL ] OUTER ):
* Para tais pesquisas vamos usar a seguinte linguagem:
3 registros para a empresa 1 (que existe na tabela de empresas);
2 registros para a empresa 2 (que existe na tabela de empresas);
1 registros para a empresa 3 (que existe na tabela de empresas);
0 registros para a empresa 4 (que existe na tabela de empresas);
1 registros para a empresa 5 (que existe na tabela de empresas);
1 registros para a empresa 8 (que NÃO existe na tabela de empresas);
Agora vamos ver como ficariam as pesquisas* (SELECT's) com os JOIN's ( INNER, [ LEFT | RIGHT | FULL ] OUTER ):
* Para tais pesquisas vamos usar a seguinte linguagem:
SELECT [CAMPOS]
FROM "TABELA_DA_ESQUERDA"
[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN "TABELA_DA_DIREITA"
1) INNER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
INNER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
FROM "TABELA_DA_ESQUERDA"
[INNER] JOIN | {LEFT | RIGHT | FULL } [OUTER]} JOIN "TABELA_DA_DIREITA"
1) INNER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
INNER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
| A.NOME | B.VALOR |
1 | UM | 1.000 |
2 | UM | 2.000 |
3 | UM | 5.000 |
4 | DOIS | 4.000 |
5 | DOIS | 9.000 |
6 | TRÊS | 7.000 |
7 | CINCO | 4.000 |
Nas pesquisas com INNER JOIN o resultado trará somente as linhas que sejam comum nas 2 tabelas, ligadas pelos campos das tabelas em questão na pesquisa.
2) LEFT OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
LEFT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
| A.NOME | B.VALOR |
1 | UM | 1.000 |
2 | UM | 2.000 |
3 | UM | 5.000 |
4 | DOIS | 4.000 |
5 | DOIS | 9.000 |
6 | TRÊS | 7.000 |
7 | QUATRO | NULL |
8 | CINCO | 4.000 |
Nas pesquisas com LEFT OUTER JOIN o resultado trará todas os registros que estejam na tabela da esquerda do JOIN (neste caso é a TABELA_A) ao menos 1 vez, mesmo que não tenham registros na tabela da direita do JOIN (neste caso é a TABELA_B) ligadas à tabela da esquerda, como é o caso da linha 7.
3) RIGHT OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
RIGHT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
RIGHT OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
| A.NOME | B.VALOR |
1 | UM | 1.000 |
2 | UM | 2.000 |
3 | UM | 5.000 |
4 | DOIS | 4.000 |
5 | DOIS | 9.000 |
6 | TRÊS | 7.000 |
7 | CINCO | 4.000 |
8 | NULL | 7.000 |
Nas pesquisas com RIGHT OUTER JOIN o resultado trará todas os registros que estejam na tabela da direita do JOIN (neste caso é a TABELA_B) ao menos 1 vez, mesmo que não tenham registros na tabela da esquerda do JOIN (neste caso é a TABELA_A) ligadas à tabela da direita, como é o caso da linha 8.
4) FULL OUTER JOIN:
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
FULL OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
SELECT A.NOME "A.NOME",
B.VALOR "B.VALOR"
FROM TABELA_A A
FULL OUTER JOIN TABELA_B B ON B.CODIGO = A.CODIGO
| A.NOME | B.VALOR |
1 | UM | 1.000 |
2 | UM | 2.000 |
3 | UM | 5.000 |
4 | DOIS | 4.000 |
5 | DOIS | 9.000 |
6 | TRÊS | 7.000 |
7 | QUATRO | NULL |
8 | CINCO | 4.000 |
9 | NULL | 7.000 |
Nas pesquisas com FULL OUTER JOIN o resultado trará todas os registros, ao menos 1 vez, que estejam nas 2 tabelas, tanto a da esquerda do JOIN (neste caso é a TABELA_A) quanto a da direita do JOIN (neste caso é a TABELA_B), como é o caso das linhas 7 e 9. O FULL poderíamos dizer que é uma junção entre o LEFT OUTER JOIN e o RIGHT OUTER JOIN.
Perfeitos os seus exemplos.
ResponderExcluirClaros e didáticos.
Parabéns !!!
João Carlos