RELACIONAMENTO ENTRE TABELAS USANDO LEFT JOIN

USUARIO.EXCLUIDOS 10/01/2005 13:19:41
#59773
Boa tarde pessoal,

Estou com um problema, tenho 4 tabelas com campos relacionados. Tentei montar uma consulta no Access q me cospisse a string sql. Consegui a Seguinte string:
SELECT CadPac.*, CadProf.NomeProf, DadoApac.*, DadoCons.CidPac
FROM (CadProf LEFT JOIN (CadPac LEFT JOIN DadoApac ON CadPac.CodPac = DadoApac.CodPac) ON CadProf.CodProf = DadoApac.MedSolic) LEFT JOIN DadoCons ON (CadProf.CodProf = DadoCons.CodMed) AND (CadPac.CodPac = DadoCons.CodPac);

Mas dá o seguinte erro:
A instrução SQL não pà'de ser executada porque contém associações externas ambíguas. Para fazer com que uma das associações seja executada primeiro, crie uma consulta separada que execute a primeira associação e, em seguida, inclua essa consulta em sua instrução SQL. (Erro 3258)

Jah tentei, tb, a seguinte string:
"SELECT CadPac.*, [CadProf].*, DadoApac.*, [DadoCons].* From CadPac, CadProf, DadoApac, DadoCons WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] And [CadProf].[CodProf]=[DadoApac].[MedSolic] And [CadPac].[CodPac]=[DadoCons].[CodPac];"

Consigo selecionar e tudo, mas quando tento dar um move next no recorset da o seguinte erro:

Operação Cancelada

O q posso fazer?!?! Preciso Selecionar estes campos pra mostrar em um form só........
Desde jah obrigado.....
USUARIO.EXCLUIDOS 10/01/2005 13:21:40
#59775
Resposta escolhida
A trua instrução sql está com problemas (óbvio hehehehe)..Faz o seguinte....explica o que são estas 3 tabelas e o que vc quer fazer...e a gente faz o sql juntos.

USUARIO.EXCLUIDOS 10/01/2005 13:54:10
#59780
tenta assim:

SELECT CadPac.*, CadProf.NomeProf, DadoApac.*, DadoCons.CidPac FROM CadProf
LEFT JOIN CadPac ON CadProf.CodProf = DadoApac.MedSolic
LEFT JOIN DadoApac ON CadPac.CodPac = DadoApac.CodPac
LEFT JOIN DadoCons ON (CadProf.CodProf = DadoCons.CodMed) AND (CadPac.CodPac = DadoCons.CodPac)
USUARIO.EXCLUIDOS 10/01/2005 14:07:56
#59783
ok Laerte.

Vamos as tabela:

CadPac: Tabela que contem os dados pessoais de pacientes
CadProf: Cadastro de Profissionais
DadoApac: Dados de preenchimento de um laudo Médico
DadoCons: Dados da ultima consulta do paciente

Eu tenho um formulário q usam todas essas tabelas. Eu tenho campos relacionados em todas:

CadPac.CodPac ---> DadoApac.CodPac
CadProf.CodProf --> DadoApac.MedSolic
CadPac.CodPac ---> DadoCons.CodPac

Preciso mostrar todos estes dados neste formulário, com todos esse relacionamentos. Fiz a Consulta no Access e me deu estes resultados.
Ele mostra todos os registros....blz...quando eu monto no VB e faço consulta tudo cert, mas quando vou mover o recordset para qualquer posição ou adicionar um novo registro ele da o segundo erro q escrevi, como posso montar esta consulta pra dar certo?

Será q fui claro?
rs
Obrigado
USUARIO.EXCLUIDOS 10/01/2005 14:12:06
#59784
Valeu Eriva_br, mas não deu certo.......
USUARIO.EXCLUIDOS 10/01/2005 14:15:32
#59785
Herbert..intaum a estrutura sql está dando certo ?..o problema é quando vc tenta mover o recordset. Quanto a inserir , eu não sei como vc está fazendo isso..mas vc não vai conseguir inseriri nada por este sql...a unica maneira de vc fazer isso seria se este sql fosse uma view do sql server..e ainda assim com algumas restrições. Este sql só te retorna dados e vc usa recordset...pra inserir vc tem que usar o proprio objeto ADODB.connection...
Eu pensei que o problema estivesse na estrutura sql..que é minha praia....não sei se poderei te ajudar ...mas como vc esta abrindo o recordset ?....manda o codigo pra gente..com certeza se eu não conseguir te ajudar ..alguém consegue...

Abraços
USUARIO.EXCLUIDOS 10/01/2005 14:27:20
#59786
olhan o código
Private Sub Form_Load()
Set mss2 = New adodb.Recordset
mss2.Open "SELECT CadPac.*, [CadProf].*, DadoApac.*, [DadoCons].* From CadPac, CadProf, DadoApac, DadoCons WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] And [CadProf].[CodProf]=[DadoApac].[MedSolic] And [CadPac].[CodPac]=[DadoCons].[CodPac];" , db

End Sub

Mas quando tento dar um mss2.MoveNext ele dá o erro

Abraços
USUARIO.EXCLUIDOS 10/01/2005 14:39:11
#59790
Herbert..ele te da o erro de operação cancelada ?...realmente não posso te ajudar neste caso.....mas dando uma olhadinha no sql acima....acho que ele pode até não estar te dando erro....mas acho que ele não vai te trazer os dados que vc quer, pois no inicio vc disse left joins e agora vc está usando inner joins.
WHERE [CadPac].[CodPac]=[DadoApac].[CodPac] aqui vc faz um inner join da CODPAC com a DADOAPAC - se não tiver dados na dadoapac.codpac iguais com a codpac.codpac ele não vai te trazer nada da cadpac.

And [CadProf].[CodProf]=[DadoApac].[MedSolic] aqui vc faz o inner join da CadProf com a dadoapac da mesma maneira..se não tiver dados na cadprod.codprof iguais na dadoapac.medsolic não vai te trazer nada.

And [CadPac].[CodPac]=[DadoCons].[CodPac]; e aqui a mesma coisa com a cadpac.codpac e dadoscons.codpac.....

Estou lhe dizendo isso pq no inicio da pergunta vc falava de left joins (eu estava supondo que o cadastro de pacientes tinha que ser exibido independente de haver os dados nas outras tabelas) e da maneira que está no sql acima isso não vai acontecer.

USUARIO.EXCLUIDOS 10/01/2005 15:43:21
#59814
Eu sei laerte, mas é q tentei usar essa por dica de um amigo
Tópico encerrado , respostas não são mais permitidas