Inquiridor
INNER JOIN em varias tabelas

Pergunta
-
Bom dia a todos, sou iniciante no que se diz sql e C#, basicamente estudo 1 hora por dia desde o inicio do ano, e estou com um problema e quero pedir a ajuda de vcs pois ele já perdura por mais de duas semanas.
Então vamos lá
Tenho uma tabela de cadastro de servidores:
idServidor
CPF
nomeServidor
matriculaServidor
dtNasServidor
Foto
idSexo
nmPai
nmMae
idEstCivil --- dados da tabela estado civil
idNaturalidade -- dados da tabela cidade
idNacionalidade -- dados da tabela NacionalidadesidRaca - dados da tabela raça
EmailTabela raça Tabela Cidade Nacionalidade Tabela Eatado Civil
idRaca idCidade idNacionalidade idEstCivil
descRaca descCidade descNacionalidade descEstCivilcepCidade
ufCidade
Estou tentando fazer assim para consultar os dados da tabela servidor junto com os dados das outras tabelas:
"SELECT Servidor.idServidor, Servidor.CPF, Servidor.nomeServidor, Servidor.matriculaServidor, Servidor.dtNasServidor, Servidor.Foto, Servidor.idSexo, Servidor.nmPai, Servidor.nmMae, EstadoCivil.descEstCivil, Cidade.descCidade, Nacionalidade.descNacionalidade, Raca.descRaca, Servidor.Email
FROM Cidade, ((EstadoCivil INNER JOIN Servidor ON EstadoCivil.idEstCivil = Servidor.idEstCivil) INNER JOIN Raca ON Servidor.idRaca = Raca.idRaca) INNER JOIN Nacionalidade ON Servidor.idNacionalidade = Nacionalidade.idNacionalidade
WHERE Servidor.CPF= " + cslqMais sempre retorna nula a consulta... meu codigo da consulta está dento de um metodo e estou fazendo a consulta através do SqlDataAdapter.
Não sei se este é o lugar certo para postar este tipo de duvida mais acho que é minha consulta que está errada e não acho o erro..
De já obrigado e um bom dia.
Luís
Todas as Respostas
-
Luís,
Três dicas:
1) Verifique se algum dos campos da tabela Servidor, que são chaves estrangeiras de outras tabelas, aceita valor NULO. Neste caso o INNER JOIN irá esconder o registro da tabela. Se é esse o problema utilize LEFT JOIN ao invés de INNER JOIN.
2) Na cláusula WHERE, como o CPF é uma string você tem que concatenar as aspas simples. Ex:
Code SnippetWHERE Servidor.CPF = '" + cpf + "'"3) Mostre o código do seu SqlDataAdapter aqui no fórum.
Espero ter ajudado.
Att.
Ari
-
Ari, Meu código é este:
public DataSete retornaServidor (string csql)
{
DataSete ds = new DataSete();
sqlDataAdapter da = new sqlDataAdapter (""SELECT Servidor.idServidor, Servidor.CPF, Servidor.nomeServidor, Servidor.matriculaServidor, Servidor.dtNasServidor, Servidor.Foto, Servidor.idSexo, Servidor.nmPai, Servidor.nmMae, EstadoCivil.descEstCivil, Cidade.descCidade, Nacionalidade.descNacionalidade, Raca.descRaca, Servidor.Email
FROM Cidade, ((EstadoCivil INNER JOIN Servidor ON EstadoCivil.idEstCivil = Servidor.idEstCivil) INNER JOIN Raca ON Servidor.idRaca = Raca.idRaca) INNER JOIN Nacionalidade ON Servidor.idNacionalidade = Nacionalidade.idNacionalidade
WHERE Servidor.CPF= " + cslq,Banco.stringConexao);
da.Fill(ds)
return ds;
}
De já agradeço.
Luís -
-
-
Luis,
Um dos problemas pode ser que não haja relacionamentos entre as tabelas. Te pergunto isso porque você está usando INNER JOINS....
Outro problema que pode estar acontecento é aqui:
....FROM Cidade, ((EstadoCivil INNER ....
Há um erro de sintaxe nesta linha... Tente desta forma:
"SELECT Servidor.idServidor, Servidor.CPF, Servidor.nomeServidor, Servidor.matriculaServidor, Servidor.dtNasServidor, Servidor.Foto, Servidor.idSexo, Servidor.nmPai, Servidor.nmMae, EstadoCivil.descEstCivil, Cidade.descCidade, Nacionalidade.descNacionalidade, Raca.descRaca, Servidor.Email FROM Servidor INNER JOIN Cidade on Servidos.IDNacionalidade = Cidade.IdCidade INNER JOIN EstadoCivil ON Servidor.idEstCivil = EstadoCivil.idEstCivil INNER JOIN Raca ON Servidor.idRaca = Raca.idRaca INNER JOIN Nacionalidade ON Servidor.idNacionalidade = Nacionalidade.idNacionalidade WHERE Servidor.CPF= " + cslq
-
Aproveitando o tópico
estou com um problema semelhante, mas o banco de dados que uso é o access e não sei se ele tem alguma limitação ou eu que estou errando, mas vamos lá
a query que estou fazendo é essa:
Select lo.NOME_FANTASIA, mo.DES_MONITOR_SAP, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
From APONTAMENTO ap Inner join LOJA lo On ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS
Where
ap.CD_LOJA = lo.CD_LOJA and
ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP and
ap.CD_PRODUTO = prod.CD_PRODUTO and
ap.CD_STATUS = stprod.CD_STATUS
quando tento fazer isso ele da erro dizendo erro de sintexa de que algum operador está faltando dentro do bloco
ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS
estou desenvolvendo uma aplicação em C# e com esse banco em ACCESS (sim eu sei, access não é banco hehehe)
-
Rodrigo,
O que está errado no seu select é a cláusula where
Antigamente você fazia JOINS entre tabelas utilizando o Where:
Select Tabela1.campo1, Tabela2.campo2 from Tabela1, Tabela2 Where Tabela1.Campo1 = Tabela2.Campo1 and
Tabela1.Campo1 = "QUALQUER VALOR"
Isso não é mais utilizado.....
Agora você deve fazer com o JOIN
Select Tabela1.campo1, Tabela2.campo2 from Tabela1 Inner Join Tabela2 On Tabela1.Campo1 = Tabela2.Campo1
WHERE Tabela1.Campo1 = "QUALQUER VALOR"
Experimente fazer a sua query desta forma:
Select lo.NOME_FANTASIA, mo.DES_MONITOR_SAP, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
From APONTAMENTO ap Inner join LOJA lo On ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS
Where <coloque aqui a sua cláusula where se necessário>
-
Roberto F Fonseca wrote: Rodrigo,
O que está errado no seu select é a cláusula where
Antigamente você fazia JOINS entre tabelas utilizando o Where:
Select Tabela1.campo1, Tabela2.campo2 from Tabela1, Tabela2 Where Tabela1.Campo1 = Tabela2.Campo1 and
Tabela1.Campo1 = "QUALQUER VALOR"
Isso não é mais utilizado.....
Agora você deve fazer com o JOIN
Select Tabela1.campo1, Tabela2.campo2 from Tabela1 Inner Join Tabela2 On Tabela1.Campo1 = Tabela2.Campo1
WHERE Tabela1.Campo1 = "QUALQUER VALOR"
Experimente fazer a sua query desta forma:
Select lo.NOME_FANTASIA, mo.DES_MONITOR_SAP, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
From APONTAMENTO ap Inner join LOJA lo On ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS
Where <coloque aqui a sua cláusula where se necessário>
então cara a clausula WHERE é essa mesmo:
Where
ap.CD_LOJA = lo.CD_LOJA and
ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP and
ap.CD_PRODUTO = prod.CD_PRODUTO and
ap.CD_STATUS = stprod.CD_STATUS
por exemplo quero que pegue todos valores aonde o CD_LOJA da tabela APONTAMENTO seja igual ao CD_LOJA da tabela LOJA, no caso usei os alias "ap" e "lo"
na primeira linha coloquei isso
e o erro ele apresenta dentro daquele bloco que coloquei, creio que o erro não seja esse, to achando que é alguma limitação do access...
-
Rodrigo,
Talvez até tenha alguma limitação do Access, mas não acho que seja... Porque o seu erro é na sua cláusula WHERE mesmo... O padrão ANSI instituiu o uso do INNER JOIN ao invés da clausula where...
Ou você vai usar:
Select Tabela1.campo1, Tabela2.campo2 from Tabela1, Tabela2 Where Tabela1.Campo1 = Tabela2.Campo1 and
Tabela1.Campo1 = "QUALQUER VALOR"
ou então, fazer com o JOIN:
Select Tabela1.campo1, Tabela2.campo2 from Tabela1 Inner Join Tabela2 On Tabela1.Campo1 = Tabela2.Campo1
WHERE Tabela1.Campo1 = "QUALQUER VALOR"
O que você está fazendo é misturando as duas sintaxes, colocando no ON o JOIN e na clásula WHERE fazendo novamente a sintaxe do "antigo join"... Você deve fazer alguma coisa assim:
Code SnippetSelect lo.NOME_FANTASIA, mo.DES_MONITOR_SAP, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
From APONTAMENTO ap Inner join LOJA lo On ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS
Where
ap.CD_LOJA = 1 and
ap.CD_MONITOR_SAP = 15 and
ap.CD_PRODUTO = 10 and
ap.CD_STATUS = 'Ativo'
os valores acima são somente exemplo, substitua-os pelos valores corretos que você deseja consultar...
-
Roberto F Fonseca wrote: Rodrigo,
Talvez até tenha alguma limitação do Access, mas não acho que seja... Porque o seu erro é na sua cláusula WHERE mesmo... O padrão ANSI instituiu o uso do INNER JOIN ao invés da clausula where...
Ou você vai usar:
Select Tabela1.campo1, Tabela2.campo2 from Tabela1, Tabela2 Where Tabela1.Campo1 = Tabela2.Campo1 and
Tabela1.Campo1 = "QUALQUER VALOR"
ou então, fazer com o JOIN:
Select Tabela1.campo1, Tabela2.campo2 from Tabela1 Inner Join Tabela2 On Tabela1.Campo1 = Tabela2.Campo1
WHERE Tabela1.Campo1 = "QUALQUER VALOR"
O que você está fazendo é misturando as duas sintaxes, colocando no ON o JOIN e na clásula WHERE fazendo novamente a sintaxe do "antigo join"... Você deve fazer alguma coisa assim:
Code SnippetSelect lo.NOME_FANTASIA, mo.DES_MONITOR_SAP, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
From APONTAMENTO ap Inner join LOJA lo On ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS
Where
ap.CD_LOJA = 1 and
ap.CD_MONITOR_SAP = 15 and
ap.CD_PRODUTO = 10 and
ap.CD_STATUS = 'Ativo'
os valores acima são somente exemplo, substitua-os pelos valores corretos que você deseja consultar...
Então Roberto, eu fiz um teste tentando fazer só essa parte no ACCESS e deu o mesmo erro:
"erro de sintaxe(operador faltando) na expressão de consulta ' Select lo.NOME_FANTASIA, mo.DES_MONITOR, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
From APONTAMENTO ap Inner join LOJA lo On ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS 'ai o trecho que eu testei...
Code SnippetSelect lo.NOME_FANTASIA, mo.DES_MONITOR, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
From APONTAMENTO ap Inner join LOJA lo On ap.CD_LOJA = lo.CD_LOJA
Inner join
MONITOR mo On ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP
Inner join
PRODUTO prod On ap.CD_PRODUTO = prod.CD_PRODUTO
Inner join
STATUS_PRODUTO stprod On ap.CD_STATUS = stprod.CD_STATUS
mesmo sem a clausula where tá dando o mesmo problema -
Descobri o problema
e serve de dica pra quem for usar o access, quando for usar varios inner ou left joins
segue aqui:
SELECT lo.NOME_FANTASIA, mo.DES_MONITOR AS Expr1, prod.DES_PRODUTO, ap.DT_APURACAO, stprod.DES_STATUS
FROM (((APONTAMENTO ap INNER JOIN LOJA lo ON ap.CD_LOJA = lo.CD_LOJA)
INNER JOIN MONITOR mo ON ap.CD_MONITOR_SAP = mo.CD_MONITOR_SAP)
INNER JOIN PRODUTO prod ON ap.CD_PRODUTO = prod.CD_PRODUTO)
INNER JOIN STATUS_PRODUTO stprod ON ap.CD_STATUS = stprod.CD_STATUS
WHERE (((ap.CD_LOJA)=[lo].[CD_LOJA]) AND ((ap.CD_MONITOR_SAP)=
.[CD_MONITOR_SAP]) AND ((ap.CD_PRODUTO)=[prod].[CD_PRODUTO]) AND ((ap.CD_STATUS)=[stprod].[CD_STATUS]));
fica ai pra quem tiver a mesma dificuldade
-
-
Bom Dia,
O Access não é totalmente aderente ao padrão ANSI e ao fazer os Joins necessita de vários parênteses para que eles funcionem corretamente. Mesmo assim, é melhor utilizar os JOINs. Junções na cláusula WHERE são repletas de desvantagens e tornam o código mais confuso.
[ ]s,
Gustavo