Duvida em sql!

6 respostas
K

Pessoal, Bom dia
Estou com um problema

Preciso fazer a seguinte consulta.
Eu tenho duas tabelas.
e preciso fazer uma consulta aonde seja retornado o cnpj com seu respectivo nome de estabelecimento.
só que as chaves primárias( se estou certo) são 9. vou enviar o meu sql.
então para achar o nome do estabelecimento do cnpj digitado vc precisa ter o cod_uf, cod_municipio, cod_distrito, cod_subdistrito,… até sequencia iguais… só assim os valores retornam iguais. Espero que alguem tenha entendido. Desde já agradeço a ajuda.

select c.cod_uf, c.cod_municipio, c.cod_distrito, c.cod_subdistrito, c.cod_setor, c.num_questionario, c.num_quadro, c.parte_quadro, c.sequencia, c.cnpj, i.nome_estabelecimento from t_cadc_carac_estab c where c.cnpj = ‘27014034000434’
left join t_cadc_identificacao i on c.cod_uf = i.cod_uf AND c.cod_municipio= i.cod_municipio AND c.cod_distrito = i.cod_distrito
AND c.cod_subdistrito = i.cod_subdistrito AND c.cod_setor = i.cod_setor
AND c.num_questionario = i.num_questionario AND c.num_quadro = i.num_quadro
AND c.parte_quadro = i.parte_quadro AND c.sequencia = i.sequencia
order by i.nome_estabelecimento;

6 Respostas

Veronicaaa

Mas qual a sua dúvida afinal? Você queria poder fazer o Select sem precisar comparar todas as PKs? Troca essa PK composta e cria uma UK composta e como PK cria um id de autonumeração ou se for Oracle uma Sequence.

w1l14n

O seu where está no lugar errado.

select c.cod_uf, c.cod_municipio, c.cod_distrito, c.cod_subdistrito, c.cod_setor, c.num_questionario, c.num_quadro, c.parte_quadro, c.sequencia, c.cnpj, i.nome_estabelecimento from t_cadc_carac_estab c where c.cnpj = '27014034000434' left join t_cadc_identificacao i on c.cod_uf = i.cod_uf AND c.cod_municipio= i.cod_municipio AND c.cod_distrito = i.cod_distrito AND c.cod_subdistrito = i.cod_subdistrito AND c.cod_setor = i.cod_setor AND c.num_questionario = i.num_questionario AND c.num_quadro = i.num_quadro AND c.parte_quadro = i.parte_quadro AND c.sequencia = i.sequencia order by i.nome_estabelecimento;

Assim é o correto:

select c.cod_uf, c.cod_municipio, c.cod_distrito, c.cod_subdistrito, c.cod_setor, c.num_questionario, c.num_quadro, c.parte_quadro, c.sequencia, c.cnpj, i.nome_estabelecimento from t_cadc_carac_estab c left join t_cadc_identificacao i on c.cod_uf = i.cod_uf AND c.cod_municipio= i.cod_municipio AND c.cod_distrito = i.cod_distrito AND c.cod_subdistrito = i.cod_subdistrito AND c.cod_setor = i.cod_setor AND c.num_questionario = i.num_questionario AND c.num_quadro = i.num_quadro AND c.parte_quadro = i.parte_quadro AND c.sequencia = i.sequencia where c.cnpj = '27014034000434' order by i.nome_estabelecimento;

K

vlw w1l14n
Nesse caso o sql funcionou, só não retornou nenhum valor, nesse caso deve ser pq não existe registro no banco.

O problema que to tendo é pq o banco que estou mexendo é uma bagunça!

Veronica… sua idéia é boa, porem o banco já está criado! e criado de forma bagunçada!
Por isso estou me enrolando
Mas agradeço as respostas.

G

[quote
Veronica… sua idéia é boa, porem o banco já está criado! e criado de forma bagunçada!
[/quote]

kra talvez dependendo da situação eh melhor vc arrumar o banco, vc já sabe q não tah legal, entao pq nao melhora-lo???

vlws

T

SELECT C.COD_UF, C.COD_MUNICIPIO, C.COD_DISTRITO, C.COD_SUBDISTRITO, C.COD_SETOR, C.NUM_QUESTIONARIO, C.NUM_QUADRO, C.PARTE_QUADRO, C.SEQUENCIA, C.CNPJ, I.NOME_ESTABELECIMENTO FROM T_CADC_CARAC_ESTAB C INNER JOIN T_CADC_IDENTIFICACAO I ON C.COD_UF = I.COD_UF AND C.COD_MUNICIPIO = I.COD_MUNICIPIO AND C.COD_DISTRITO = I.COD_DISTRITO AND C.COD_SUBDISTRITO = I.COD_SUBDISTRITO AND C.COD_SETOR = I.COD_SETOR AND C.NUM_QUESTIONARIO = I.NUM_QUESTIONARIO AND C.NUM_QUADRO = I.NUM_QUADRO AND C.PARTE_QUADRO = I.PARTE_QUADRO AND C.SEQUENCIA = I.SEQUENCIA WHERE C.CNPJ = '27014034000434' ORDER BY I.NOME_ESTABELECIMENTO

Casso não retorne nada os dados estão incorretos!

Abraço

K

Bom,

Vi que o problema era em como os dados estavam no banco.

O Sql funcionou!

Agradeço a todos pelas respostas.

Criado 23 de outubro de 2008
Ultima resposta 23 de out. de 2008
Respostas 6
Participantes 5