none
INNER JOIN em varias tabelas RRS feed

  • 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 Nacionalidades

    idRaca -  dados da tabela raça
    Email

     

    Tabela raça           Tabela Cidade              Nacionalidade              Tabela Eatado Civil    

    idRaca                  idCidade                      idNacionalidade            idEstCivil
    descRaca             descCidade                  descNacionalidade       descEstCivil

                               cepCidade

                               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= " + cslq

    Mais 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

     

    terça-feira, 7 de outubro de 2008 16:17

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 Snippet
    WHERE Servidor.CPF = '" + cpf + "'"

     

     

     

    3) Mostre o código do seu SqlDataAdapter aqui no fórum.

     

    Espero ter ajudado.

     

    Att.

     

    Ari

    terça-feira, 7 de outubro de 2008 17:01
  • 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
    terça-feira, 7 de outubro de 2008 17:36
  • Luís,

     

    Então o problema é que você não está colocando as aspas simples.

     

    Code Snippet

    ...Servidor.CPF= '" + cslq + "'",Banco.stringConexao);

     

    Att.

     

    Ari

    terça-feira, 7 de outubro de 2008 17:45
  • Boa Tarde,

     

    Poste a mensagem de erro.

    Fiquei curioso sobre sua construção. Seu banco de dados é SQL Server ?

     

    [ ]s,

     

    Gustavo

    terça-feira, 7 de outubro de 2008 19:42
  • 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

    quarta-feira, 8 de outubro de 2008 00:56
    Moderador
  •  

    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)

    quarta-feira, 8 de outubro de 2008 17:14
  •  

    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>

    quarta-feira, 8 de outubro de 2008 23:44
    Moderador
  •  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...

    quinta-feira, 9 de outubro de 2008 00:26
  • 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 Snippet

    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 = 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...

     

    quinta-feira, 9 de outubro de 2008 02:20
    Moderador
  •  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 Snippet

    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 = 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 Snippet
    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

     

     


    mesmo sem a clausula where tá dando o mesmo problema

    quinta-feira, 9 de outubro de 2008 11:22
  •  

    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)=[mo].[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

     

    quinta-feira, 9 de outubro de 2008 15:18
  • CARA VC PODE FAZER  TBM USANDO SOMENTE O WHERE AO INVÉS DE INNER/LEFT JOIN   EX:

    SELEC * FROM

    CadCli a,

    Nome Cli b

    WHERE

    a.cfp = b.cpf

    AND

    ......

    AND

    ......

    AND

    Espero ter ajudado

    segunda-feira, 13 de outubro de 2008 00:46
  • 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

    segunda-feira, 13 de outubro de 2008 09:40