[Resolvido] Preciso de algo similar ao JOIN
Dae gente,
Acho que estou com um probleminha nas mãos... É um desafio, eu já rodei o google todo e não achei algo que ajudasse hehe é o seguinte:
Supondo que tenho as 4 tabelas a seguir (todos os dados são fictícios, desculpem não sou criativo para exemplos):
PRINCIPAL
--------------------------------
ID_P | DESCRICAO | TIPO | ID_FK <- Uma chave estrangeira que pode ser qualquer um dos IDs das 2 tabelas a seguir.
1 TESTE NULL NULL
2 TESTE B Y 1
3 TESTE C Z 2
4 TESTE D Z 1
O campo TIPO indica se a relação será com a tabela 1 ou 2. Exemplo: SE TIPO = 'Z' ID_FK será ligado com ID_T1.
TABELA_1
-------------------------------
ID_T1 | DESCRICAO | ID_TABELA_3 <- Chave estrangeira de ligação com a TABELA 3, é simples não é problema.
1 BRASIL 80
2 CHILE 81
3 EUA 82
TABELA_2
----------------------------------
ID_T2 | DESCRICAO | ID_TABELA_3
1 SAO PAULO 82
2 PORTO ALEGRE 84
3 MANAUS 90
TABELA_3
-----------------------
ID_TABELA_3 | DESCRICAO
80 VERDE
81 AZUL
82 AMARELO
84 LARANJA
86 ROXO
90 PRETO
Bom, funciona assim:
O campo ID_FK na tabela PRINCIPAL pode ser tanto NULO quanto ligado às outras 2 TABELAS. Ou seja um LEFT JOIN TABELA_X ON PRINCIPAL.ID_FK = TABELA_X.ID_TX
Eu preciso buscar os dados da PRINCIPAL, os dados da tabela ligada ao registro corrente na busca e os dados da TABELA 3 ligados à tabela corrente.
Porém, não posso usar o LEFT JOIN pois ele está me retornando resultados "mesclados". Com LEFT JOIN a query fica assim:
SELECT P.ID_P, P.DESCRICAO, T1.DESCRICAO, T2.DESCRICAO, TA.DESCRICAO, TB.DESCRICAO FROM PRINCIPAL AS P
LEFT JOIN TABELA_1 AS T1 ON T1.ID_T1 = P.ID_FK -- Junção da tabela 1 com a principal
LEFT JOIN TABELA_2 AS T2 ON T2.ID_T2 = P.ID_FK -- Junção da tabela 2 com a principal
LEFT JOIN TABELA_3 AS TA ON TA.ID_TABELA_3 = T1.ID_TABELA_3 -- Junção da tabela 1 com a tabela 3
LEFT JOIN TABELA_3 AS TB ON TB.ID_TABELA_3 = T2.ID_TABELA_3 -- Junção da tabela 2 com a tabela 3
O que ela me retornaria:
ID_P | P.DESCRICAO | T1.DESCRICAO | T2.DESCRICAO | TA.DESCRICAO | TB.DESCRICAO
------------------------------------------------------------------------------
1 | TESTE | | | |
2 | TESTE B | BRASIL | SAO PAULO | VERDE | AMARELO
3 | TESTE C | CHILE | PORTO ALEGRE | AZUL | LARANJA
4 | TESTE D | BRASIL | SAO PAULO | VERDE | AMARELO
Mas na verdade o que eu preciso é só os dados da tabela ligada, usando o campo TIPO pra identificar isso. Eu já consegui buscar uma descrição só, assim:
SELECT P.ID_P, P.DESCRICAO,
(SELECT T1.DESCRICAO FROM TABELA_1 AS T1 WHERE T1.ID_T1 = P.ID_FK AND P.TIPO = 'Z'),
(SELECT T2.DESCRICAO FROM TABELA_2 AS T2 WHERE T2.ID_T2 = P.ID_FK AND P.TIPO = 'Y')
FROM PRINCIPAL AS P
Retorno:
ID_P | P.DESCRICAO | T1.DESCRICAO | T2.DESCRICAO
------------------------------------------------
1 | TESTE | |
2 | TESTE B | | SAO PAULO
3 | TESTE C | CHILE |
4 | TESTE D | BRASIL |
Até aqui tá ok, mas nas subquerys de SELECT ali eu tentei incluir os dados da TABELA_3 que preciso relacionar, além de que tenho ouros campos nas tabelas 1 e 2 além do DESCRICAO citado nesse exemplo para buscar. No caso eu tentei fazer isso:
SELECT P.ID_P, P.DESCRICAO,
(SELECT T1.DESCRICAO, TA.DESCRICAO FROM TABELA_1 AS T1 JOIN TABELA_3 AS TA ON TA.ID_TABELA_3 = T1.ID_TABELA_3 WHERE T1.ID_T1 = P.ID_FK AND P.TIPO = 'Z'),
(SELECT T2.DESCRICAO, TB.DESCRICAO FROM TABELA_2 AS T2 JOIN TABELA_3 AS TB ON TB.ID_TABELA_3 = T2.ID_TABELA_3 WHERE T2.ID_T2 = P.ID_FK AND P.TIPO = 'Y')
FROM PRINCIPAL AS P
Qual seria o resultado esperado:
ID_P | P.DESCRICAO | T1.DESCRICAO | T2.DESCRICAO | TA.DESCRICAO | TB.DESCRICAO
------------------------------------------------------------------------------
1 | TESTE | | | |
2 | TESTE B | | SAO PAULO | | AMARELO
3 | TESTE C | CHILE | | AZUL |
4 | TESTE D | BRASIL | | VERDE |
Mas estas subquerys aparentemente não podem retornar mais que 1 coluna quando não estão no WHERE...
Pra mim a solução é simples: Unir as colunas da subquery com a da principal, assim como o JOIN faz. Não entendo muito de VIEW e não sei se uma poderia resolver o problema aqui, e mesmo assim não posso utilizar uma neste caso por motivos que não vem ao caso. Nem uma PROCEDURE. Mesmo assim, se uma das duas resolverem o problema fico grato se alguém postar, pelo menos só para que eu saiba e veja a solução dessa história.
Espero que tenha sido claro, qualquer ajuda é bem-vinda, fico grato desde já.
Discussão (6)
Carregando comentários...