Duvida de SQL!

13 respostas
felipe_thrash

Galera…

no join ( na mãozona mesmo)

pegamos para igualar só primary keys, (seria mais trabalhoso pro banco !?)

ou primary keys e foreign keys ??? ( mais trabalho pro desenvolvedor !!!)

valews!
:wink:

13 Respostas

tnaires

Em JOINs, você sempre iguala chaves primárias de uma tabela com chaves estrangeiras da outra.
Exemplo:

Pessoa

  • idPessoa
  • Nome

ContatoPessoa

  • idContato
  • idPessoa
  • Telefone

SELECT p.Nome, cp.Telefone
FROM Pessoa p
INNER JOIN ContatoPessoa cp ON cp.idPessoa = p.idPessoa

Abraços

felipe_thrash

pois é... mas olha só... como o pessoal faz aki..

SELECT cc.loj_loja,
       cc.cli_cliente,

       vv.ven_venda,
       vv.cli_cliente,
       fpg.loj_loja,
       fpg.ven_venda,
       pdt.tir_parcela
       
FROM   cliente cc,
       venda vv,
       ponte fpg,
       ponte_d_titulo pdt
       
WHERE cc.loj_loja = vv.loj_loja
AND      cc.loj_loja = fpg.loj_loja
AND      cc.loj_loja = pdt.loj_loja
AND      vv.ven_venda = pdt.ven_venda
AND      vv.ven_venda = fpg.ven_venda

não posso fazer assim... não posso filtrar loj_loja e ven_venda ao mesmo tempo...

tem q ser uma ou outra! senão o maldito nao aceita!

teria outra solução!?

tnaires

Coloque a estrutura das tabelas envolvidas e dê mais detalhes sobre o que você precisa que essa consulta retorne.

felipe_thrash

pois é.. os campos são PK...


cliente
----------
loj_loja - PK
cli_cliente - PK

venda
----------
loj_loja - PK
ven_venda - PK

ponte
----------
loj_loja - PK
ven_venda - PK

ponte_d_titulo
-------------------
loj_loja - PK
ven_venda - PK

como to fazendo um relatorio no iReport.. e são muitos registros....
ta demorando demais...
daí me falaram pra filtrar primary keys... q sairia + rapido

estou em dúvida em proceder....

aki ele nao roda, quando filtro loj_loja e ven_venda juntos...
# WHERE cc.loj_loja = vv.loj_loja  
# AND      cc.loj_loja = fpg.loj_loja  
# AND      cc.loj_loja = pdt.loj_loja  
# AND      vv.ven_venda = pdt.ven_venda  
# AND      vv.ven_venda = fpg.ven_venda

só separadamente... :cry:

alexeyh

teste

felipe_thrash

!?

teste…

ja testei!!!
não funfa de jeito nenhum…

D

Felipe,
Esse seu modelo está estranho!

Pelo que entendi não tem como você implementar um relacionamento entre a venda e o cliente.

Veja se o seu modelo responde essa pergunta, que isso que está faltando na sua base.

D

Kra posta pra mim qual o resultado que você quer.

Exemplo:

Totalizar vendas por loja
Todas as vendas de uma loja

Obs: Teu modelo não permite relacionar venda x cliente

felipe_thrash
SELECT cc.loj_loja,
       cc.cli_cliente,
       cc.cic_cep,
       cc.cli_nome,
       cc.cli_cpf_cgc,
       cc.cli_endereco,
       vv.ven_venda,
       vv.ven_data,
       vv.ven_valor,
       vv.ven_desc
       --vv.cli_cliente,
       --fpg.loj_loja,
       --fpg.ven_venda,
       --fpg.fve_codigo,
       --pp.pes_codigo,
       --pp.pes_cidade,
       --pp.pes_uf
       
FROM   greletro.cliente cc,
       venda vv,
       ponte_eletro fpg,
       cliente_nome cn,
       asa_venda fv
       pessoa pp
       
WHERE cc.loj_loja = vv.loj_loja
AND   vv.loj_loja = fpg.loj_loja
AND   vv.ven_venda = fpg.ven_venda
AND   cc.cli_cliente = vv.cli_cliente
AND   fpg.fve_codigo = fv.fve_codigo
--AND   pp.emp_codigo = cc.loj_loja
--AND   pp.emp_codigo = cn.emp_codigo
--AND   pp.pes_codigo = cn.pes_codigo
  

--AND vv.loj_loja = 154
AND vv.ven_venda = 13661

tudo sobre um cliente e o q comprou (futuramente vou implantar) através de um numero de venda

no caso --> ven_venda = 13661

meu problema são os filtros.... aaaaafffffi

so quando defino a loja = 154 tb... é q vem um unico registro
tirando ela ainda da pau...

mexer com select é coisa do demo... principalmente com umas tabelas malucas dessas...

Dieval_Guizelini

acho que você está utilizando duas relações que estão sendo excludentes:

SELECT cc.loj_loja,
cc.cli_cliente,
cc.cic_cep,
cc.cli_nome,
cc.cli_cpf_cgc,
cc.cli_endereco,
vv.ven_venda,
vv.ven_data,
vv.ven_valor,
vv.ven_desc
–vv.cli_cliente,
–fpg.loj_loja,
–fpg.ven_venda,
–fpg.fve_codigo,
–pp.pes_codigo,
–pp.pes_cidade,
–pp.pes_uf

FROM greletro.cliente cc
LEFT JOIN venda vv ON cc.loj_loja = vv.loj_loja and cc.cli_cliente = vv.cli_cliente
LEFT JOIN ponte_eletro fpg ON vv.loj_loja = fpg.loj_loja and vv.ven_venda = fpg.ven_venda
LEFT JOIN pessoa pp ON pp.emp_codigo = cc.loj_loja
LEFT JOIN cliente_nome cn ON pp.pes_codigo = cn.pes_codigo <<----- aqui acho que deve ter uma relacao com cc
LEFT JOIN asa_venda fv ON fpg.fve_codigo = fv.fve_codigo

–AND vv.loj_loja = 154
AND vv.ven_venda = 13661


loja e pessoa.

Tente pensar nesse modelo segundo a tabela fato (na estrutura de cubos, normalmente desnormalizada e pode ser uma view em seu sistema ou uma subquery).
Identifique entre as tabelas quais são inner join e quais são outer, você fez tudo como se fosse inner, e talvez não seja.
Por exemplo os clientes que nunca compraram ou que a última compra já está no arquivo morto e as querys nada tem a retornar.

ai, voce pode pensar em usar subquerys e fazer a relação com elas, exemplo:

select …
from
(select … from pessoa,cliente) as cc
left join venda vv on cc.alguma_coisa = vv.alguma coisa

deixe o where apenas para os filtros, é mais fácil fazer combinações com OR, que acho que é o que você quer.

que banco você está utilizando?

fw

D

Acho que no seu caso todos os clientes já necessariamente já efetuaram uma compra isso?

Se for essa questão, certamente você só precisaria de uma query simples como essa.

Primeiro,
Selecione todos os clientes:

select	cli.nom_cliente
,	cli.cod_cliente
,	cli.num_cpf

from	cliente_nome cli

Segundo,
Selecionando todas as vendas de cada cliente:

select	cli.nom_cliente
,	cli.cod_cliente
,	cli.num_cpf
,	cli.endereco
,	ven.ven_venda
,	ven.ven_data
,	ven.valor
,	ven.ven_desc

from	cliente_nome	cli
,	venda		ven

where	cli.cod_cliente = ven.cod_cliente

Terceiro,
Descobrindo em quais lojas as vendas de cada cliente foram realizadas:

select	cli.nom_cliente
,	cli.cod_cliente
,	cli.num_cpf
,	cli.endereco
,	ven.ven_venda
,	ven.ven_data
,	ven.valor
,	ven.ven_desc
,	loj.cod_loja
,	loj.desc_loja

from	cliente_nome	cli
,	venda		ven
,	loja		loj

where	cli.cod_cliente = ven.cod_cliente
and	lj.cod_loja = ven.cod_loja
felipe_thrash

sim sim é isso mesmo!

o filtro é o mais dificil do select… se mão fizer direito, ele multiplica as informações

Obrigado a todos!
:wink:

T

Qual banco está utilizando?

Criado 18 de janeiro de 2008
Ultima resposta 22 de jan. de 2008
Respostas 13
Participantes 6