Descrição:
Como unir os dados de tabelas diferentes de um mesmo banco de dados com a função FULL OUTER JOIN? Preciso unir os dados de duas tabelas que possuem uma coluna semelhante entre si, que exibe a data, mas o outro campo de cada tabela apresenta ações diferentes. Para isso, criei um código SQL utilizando a função FULL OUTER JOIN, e gostaria de ordenar os dados na tabela na seguinte sequência: primeiro a TimeStamp, e logo após os dois campos separados. No entanto, ao unir os dados das tabelas em uma só, o campo DataHora da tabela resultante retorna valores nulos.
Na figura abaixo, vemos as tabelas utilizadas neste caso:
Sintaxe SQL:
SELECT Tbl1.E3TimeStamp AS DataHora, Tbl1.Campo1,Tbl2.Campo2 FROM Tbl1 FULL OUTER JOIN Tbl2 ON Tbl1.E3TimeStamp = Tbl2.E3TimeStamp ORDER BY DataHora ASC
O resultado da união destas tabelas através da função FULL OUTER JOIN está ilustrado na figura abaixo:
Por que isso acontece? Como posso resolver esta situação?
Solução:
Antes de tudo, é importante saber que quando se utiliza a função FULL OUTER JOIN para unir dados de tabelas com valores diferentes no campo E3TimeStamp, o resultado será nulo. Para que funcione perfeitamente, a função necessita que haja uma correspondência total entre os campos da Tabela 1 e da Tabela 2.
Dica: FULL OUTER JOIN e FULL JOIN significam a mesma função.
Dessa forma, para consertar a situação, basta substituir os valores da primeira tabela pelo E3TimeStamp da segunda tabela. Assim, os valores das colunas coincidirão, e por isso os valores de retorno não serão nulos. Para isto, utilize a função ISNULL. Essa função retorna um valor específico se a expressão for NULL; se a expressão não for NULL, ela retorna a expressão.
A sintaxe utilizada é:
ISNULL (expression, value)
O parâmetro expression testa se a expressão é NULL. O parâmetro value é retornado se a expression for NULL.
Exemplo de sintaxe SQL:
SELECT ISNULL (Tbl1.E3TimeStamp,Tbl2.E3TimeStamp) AS DataHora, Tbl1.Campo1,Tbl2.Campo2 FROM Tbl1 FULL OUTER JOIN Tbl2 ON Tbl1.E3TimeStamp = Tbl2.E3TimeStamp ORDER BY DataHora ASC
Assim, o resultado será igual ao da figura abaixo: