INNER JOIN O QUE ESTA ERRADO?
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:
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
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
Qual seu Banco de Dados ?
Access2k
Eu nunca vi este trecho NO ACCESS
"OUTER JOIN"
"FROM tblDetSec tblsec"
até onde eu sei ficaria assim
From Tabela1 INNER JOIN tabela2 ON (Tabela1.Campo1=Tabela2.Campo1)
"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)
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:
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;
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?
Ou o melhor seria fazer 3 consultas buscando os dados pelo ID?
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.....
vc teria que fazer assim
select ....
from tabela1, tabela2, tabela3, tabela4
where.....
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?
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?
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?
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?
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.
Tente isso:
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.
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.
Tópico encerrado , respostas não são mais permitidas