Conceitos
Tabela Departamento (DEPT)
| DEPTNO |
DEPTNAME |
| A01 |
ACCOUNTING |
| A02 |
PAYROLL |
| A03 |
OPERATIONS |
| A04 | PERSONNEL |
| A05 |
MAINTENANCE |
Tabela Empregados (EMP)
| EMPNO |
WORKDEPT |
| 5001 |
A01 |
| 5002 |
A04 |
| 5003 |
A03 |
| 5004 |
A03 |
| 5005 |
A04 |
| 5006 |
A04 |
| 5007 |
A03 |
| 5008 |
A06 |
Tabela Projetos (PROJ)
| PROJNO | EMPNO |
| P1011 |
5002 |
| P1011 |
5006 |
| P1012 |
5001 |
| P1013 |
5010 |
| P1014 |
5003 |
| P1014 |
5004 |
| P1014 |
5005 |
| P1015 |
5008 |
Full outer join combinando três tabelas e usando COALESCE e subquery
| SELECT |
COALESCE(C.EMPNO, D.EMPNO, 'NO EMP') AS EMP_NO, |
| COALESCE(C.DEPTNO, C.WORKDEPT, 'NO DEPT') AS DEPT_NO, |
|
| COALESCE(C.DEPTNAME, 'NO DEPT NAME') AS DEPT_NAME |
|
| COALESCE(D.PROJNO, 'NO PROJECT') AS PROJ_NO | |
| FROM | |
| (SELECT A.DEPTNO, A.DEPTNAME, B.EMPNO, B.WORKDEPT | |
| FROM PW0001.DEPT A | |
| FULL JOIN PW0001.EMP B |
|
| ON A.DEPTNO = B.WORKDEPT) C |
|
| FULL JOIN PW0001.PROJ D | |
| ON C.EMPNO = D.EMPNO | |
| ORDER BY EMP_NO, DEPT_NO |
Tabela Intermediária
| DEPTNO | DEPTNAME |
EMPNO |
WORKDEPT |
| A01 |
ACCOUNTING |
5001 |
A01 |
| A04 |
PERSONNEL |
5002 |
A04 |
| A03 |
OPERATIONS |
5003 |
A03 |
| A03 |
OPERATIONS |
5004 |
A03 |
| A04 |
PERSONNEL |
5005 |
A04 |
| A04 |
PERSONNEL |
5006 |
A04 |
| A03 |
OPERATIONS |
5007 |
A03 |
| <null> |
<null> |
5008 |
A06 |
| A02 |
PAYROLL |
<null> |
<null> |
| A05 |
MAINTENANCE |
<null> |
<null> |
Tabela Resultado
| EMP_NO | DEPT_NO |
DEPT_NAME |
PROJ_NO |
| NO EMP |
A02 | PAYROLL | NO PROJECT |
| NO EMP | A05 |
MAINTENANCE |
NO PROJECT |
| 5001 | A01 |
ACCOUNTING |
P1012 |
| 5002 | A04 |
PERSONNEL |
P1011 |
| 5003 | A03 |
OPERATIONS |
P1014 |
| 5004 | A03 |
OPERATIONS | P1014 |
| 5005 | A04 |
PERSONNEL |
P1014 |
| 5006 | A04 |
PERSONNEL |
P1011 |
| 5007 | A03 |
OPERATIONS |
NO PROJECT |
| 5008 | A06 |
NO DEPT NAME |
P1015 |
| 5010 |
NO DEPT |
NO DEPT NAME |
P1013 |
Na declaração SELECT acima, aparece uma segunda declaração SELECT na cláusula FROM. Esta segunda SELECT, codificada entre parênteses é denominada subquery.
No exemplo, a subquery efetua o full join das tabelas DEPT e EMP criando a tabela intermediária cujo sinonimo é "C". A declaração SELECT principal então efetua o full join da tabela intermediária com a tabela PROJ gerando a tabela resultado.
Ao se efetuar outer joins de três ou mais tabelas, é comum o uso de subqueries para efetuar os joins de duas tabelas a cada etapa.
A primeira função COALESCE existem três argumentos; C.EMPNO, D.EMPNO e 'NO EMP'. O resultado da execução da função é retornar o primeiro valor não nulo encontrado.
Se a cláusula ORDER BY não for utilizada, a tabela resultado terá uma sequencia de linhas sem sentido.