INNER JOIN O QUE ESTA ERRADO?

TAMANINI 01/12/2006 17:12:22
#187474
Estou montando uma consulta com INNER JOIN para buscar os dados de 3 tabelas, mas está gerando erro no inner join, o que estou fazendo:
SELECT 
tblsec.det_sec_h, tblsec.det_sec_t1, tblsec.det_sec_t2,
tblsec.det_sec_t3, tblsec.det_sec_t4,
tbltrat.det_trat_h, tbltrat.det_trat_t1, tbltrat.det_trat_t2,
tbltrat.det_trat_t3, tbltrat.det_trat_t4,
tblhst.hst_ncrt, tblhst.hst_nl, tblhst.hst_bstmp, tblhst.hst_nlt,
tblhst.hst_ntrat, tblhst.hst_desc, tblhst.hst_inicic, tblhst.hst_fimcic,
tblhst.hst_initrat, tblhst.hst_dttrat, tblhst.hst_sensor,
tblhst.hst_tc, tblhst.hst_tt, tblhst.hst_tmpt, tblhst.hst_resp,
tblhst.hst_op, tblhst.hst_run
FROM tblDetSec tblsec, tblDetTrat tbltrat
left outer join tblHstCiclo tblhst on (tblhst.hst_id = tblsec.hst_id)
left outer join tblHstCiclo tblhst on (tblhst.hst_id = tbltrat.hst_id)
WHERE
tblhst.hst_id = 10;


O relacionamento no caso é 1 para n, no caso na tblDetSec eu posso ter até 999 registros de 1 registro da tblHstCiclo e na tblDetTrat, posso ter até 50 registros de 1 registro da tblHstCiclo.
Segue abaixo a imagem de como está o relacionamento:
relacionamento
CLEVERTON 01/12/2006 17:29:19
#187484
Qual seu Banco de Dados ?
TAMANINI 01/12/2006 17:36:16
#187488
Access2k
CLEVERTON 01/12/2006 17:40:52
#187489
Eu nunca vi este trecho NO ACCESS
"OUTER JOIN"
"FROM tblDetSec tblsec"


FROM tblDetSec tblsec, tblDetTrat tbltrat
left outer join tblHstCiclo tblhst on (tblhst.hst_id = tblsec.hst_id)
left outer join tblHstCiclo tblhst on (tblhst.hst_id = tbltrat.hst_id)


até onde eu sei ficaria assim

From Tabela1 INNER JOIN tabela2 ON (Tabela1.Campo1=Tabela2.Campo1)
TAMANINI 01/12/2006 18:02:06
#187497
Mas funciona se eu fizer uma consulta com duas tabelas, mas nesse caso são 3 e com possibilidade de ser até 4.
Com duas fica assim:
SELECT
tblsec.det_sec_h, tblsec.det_sec_t1, tblsec.det_sec_t2,
tblsec.det_sec_t3, tblsec.det_sec_t4,
tblhst.hst_ncrt, tblhst.hst_nl, tblhst.hst_bstmp, tblhst.hst_nlt,
tblhst.hst_ntrat, tblhst.hst_desc, tblhst.hst_inicic, tblhst.hst_fimcic,
tblhst.hst_initrat, tblhst.hst_dttrat, tblhst.hst_sensor,
tblhst.hst_tc, tblhst.hst_tt, tblhst.hst_tmpt, tblhst.hst_resp,
tblhst.hst_op, tblhst.hst_run
FROM tblDetSec tblsec
left outer join tblHstCiclo tblhst on (tblhst.hst_id = tblsec.hst_id)
WHERE
tblhst.hst_id = 10;

TAMANINI 04/12/2006 08:17:23
#187706
Cleverton, você saberia me dizer se há possibilidade de utilizar algum JOIN nessa consulta com 3 tabelas ou mais(4 tabelas)?
Ou o melhor seria fazer 3 consultas buscando os dados pelo ID?
HUGOSSOUZA 04/12/2006 08:34:33
#187708
pelo que eu testei até hoje usando DAO e ADO o access só aceita 1 join...
vc teria que fazer assim

select ....
from tabela1, tabela2, tabela3, tabela4
where.....




TAMANINI 04/12/2006 09:00:59
#187720
Sim, mas no meu caso, se vc for ver na imagem que postei acima, o meu relacionamento é 1 para n, ou seja, eu terei que trazer um registro da tblHstCiclo e vários registros das tblDetSec, tblDetTrat e possívelmente da tblProdCc que pertencem aquele registro da tblHstCiclo.
Por isso a dúvida em ter como trazer todos esses registros em apenas uma consulta, ou terei que fazer um SELECT para cada tabela?
USUARIO.EXCLUIDOS 04/12/2006 10:11:08
#187757
Tem como fazê-lo sim, mas ao invés de usar inner join que é mais lento, utilize direto a cláusula Where se for possível claro, ficará mais rápido e não dará o erro.

SELECT
tblsec.det_sec_h, tblsec.det_sec_t1, tblsec.det_sec_t2,
tblsec.det_sec_t3, tblsec.det_sec_t4,
tbltrat.det_trat_h, tbltrat.det_trat_t1, tbltrat.det_trat_t2,
tbltrat.det_trat_t3, tbltrat.det_trat_t4,
tblhst.hst_ncrt, tblhst.hst_nl, tblhst.hst_bstmp, tblhst.hst_nlt,
tblhst.hst_ntrat, tblhst.hst_desc, tblhst.hst_inicic, tblhst.hst_fimcic,
tblhst.hst_initrat, tblhst.hst_dttrat, tblhst.hst_sensor,
tblhst.hst_tc, tblhst.hst_tt, tblhst.hst_tmpt, tblhst.hst_resp,
tblhst.hst_op, tblhst.hst_run
FROM tblDetSec tblsec, tblDetTrat tbltrat
WHERE tblhst.hst_id = tblsec.hst_id and
tblhst.hst_id = tbltrat.hst_id and
tblsec.hst_id = tbltrat.hst_id and
tblhst.hst_id = 10;

agora se não for possível, experimente tirar o outer e colocar somente left join, desta forma:


SELECT
tblsec.det_sec_h, tblsec.det_sec_t1, tblsec.det_sec_t2,
tblsec.det_sec_t3, tblsec.det_sec_t4,
tbltrat.det_trat_h, tbltrat.det_trat_t1, tbltrat.det_trat_t2,
tbltrat.det_trat_t3, tbltrat.det_trat_t4,
tblhst.hst_ncrt, tblhst.hst_nl, tblhst.hst_bstmp, tblhst.hst_nlt,
tblhst.hst_ntrat, tblhst.hst_desc, tblhst.hst_inicic, tblhst.hst_fimcic,
tblhst.hst_initrat, tblhst.hst_dttrat, tblhst.hst_sensor,
tblhst.hst_tc, tblhst.hst_tt, tblhst.hst_tmpt, tblhst.hst_resp,
tblhst.hst_op, tblhst.hst_run
FROM tblDetSec tblsec, tblDetTrat tbltrat
left join tblHstCiclo tblhst on tblhst.hst_id = tblsec.hst_id
left join tblHstCiclo tblhst on tblhst.hst_id = tbltrat.hst_id
WHERE
tblhst.hst_id = 10;

Mais uma coisa, ele dá alguma mensagem de erro? se sim qual é a mensagem?

USUARIO.EXCLUIDOS 04/12/2006 10:18:07
#187759
Citação:

agora se não for possível, experimente tirar o outer e colocar somente left join, desta forma:



Pelo que o Hugo falou, nem com Left Join funcionaria, pois o access só aceita 1 join, ou seja, apenas duas tabelas.

Teria que ser pelo primeiro exemplo do Marco mesmo, pela clausula where.
USUARIO.EXCLUIDOS 04/12/2006 10:43:51
#187764
Tente isso:

 

SELECT
tblsec.det_sec_h, tblsec.det_sec_t1, tblsec.det_sec_t2,
tblsec.det_sec_t3, tblsec.det_sec_t4,
tbltrat.det_trat_h, tbltrat.det_trat_t1, tbltrat.det_trat_t2,
tbltrat.det_trat_t3, tbltrat.det_trat_t4,
tblhst.hst_ncrt, tblhst.hst_nl, tblhst.hst_bstmp, tblhst.hst_nlt,
tblhst.hst_ntrat, tblhst.hst_desc, tblhst.hst_inicic, tblhst.hst_fimcic,
tblhst.hst_initrat, tblhst.hst_dttrat, tblhst.hst_sensor,
tblhst.hst_tc, tblhst.hst_tt, tblhst.hst_tmpt, tblhst.hst_resp,
tblhst.hst_op, tblhst.hst_run
FROM tblDetSec tblsec
INNER JOIN tblDetTrat tbltrat on (tblsec.det_trat_id = tblsec.hst_id)
left outer join tblHstCiclo tblhst on (tblhst.hst_id = tblsec.hst_id)
left outer join tblHstCiclo tblhst on (tblhst.hst_id = tbltrat.hst_id)
WHERE
tblhst.hst_id = 10;



Independente de qual banco use, vc pode fazer join em quantas tabelas forem necessárias. O que penso que está errado é vc fazer select em 2 tabelas e depois sair fazendo join.
Página 1 de 3 [27 registro(s)]
Tópico encerrado , respostas não são mais permitidas