Consulta Query - buscando dados da mesma tabela

Delphi

22/11/2005

Tenho uma tabela onde busco qual o remetente e o destinatário no mesmo pedido e esse remente e destinatário é cadastrado na mesma tabela de clientes, só que na consulta com query, não estou conseguindo fazer, acontece assim, como eu estou pegando em dois códigos diferentes na mesma tabela, no caso a de clientes qdo coloco pra trazer os dois clientes (CodRem e CodDest) conforme abaixo não dá certo só qdo é um somente os dois não traz nada na consulta.

SQL.Add(´Select pedido .Numero, pedido .DataEmissao,
pedido.CodRem,pedido .CodDest,Clientes.Nome as Rem,Clientes.Nome as Dest´);
SQL.Add(´From pedido ,Clientes´);
SQL.Add(´Where pedido .CodRem=Clientes.Codigo´);
SQL.Add(´and pedido .CodDest=Clientes.Codigo´);

Como resolver essa situação?


Janete

Janete

Curtidas 0

Respostas

Emerson Nascimento

Emerson Nascimento

22/11/2005

Select
  Ped.Numero, Ped.DataEmissao,
  Ped.CodRem, Rem.Nome Remetente,
  Ped.CodDest, Dest.Nome Destinatario
From
  Pedido Ped
left join
  Clientes Rem on (Rem.Codigo = Ped.CodRem)
left join
  Clientes Dest on (Dest.Codigo = Ped.CodDest)



GOSTEI 0
Janete

Janete

22/11/2005

Select
  Ped.Numero, Ped.DataEmissao,
  Ped.CodRem, Rem.Nome Remetente,
  Ped.CodDest, Dest.Nome Destinatario
From
  Pedido Ped
left join
  Clientes Rem on (Rem.Codigo = Ped.CodRem)
left join
  Clientes Dest on (Dest.Codigo = Ped.CodDest)


Fiz dessa formas, mas tb não deu certo, agora ele traz a qdo de pedido mesmo sendo um somente repedido para a quantidade de cliente.


GOSTEI 0
Edilcimar

Edilcimar

22/11/2005

tente select distinct


GOSTEI 0
Janete

Janete

22/11/2005

tente select distinct


Acrescentei oq vc falou e agora ficou dessa forma:

SQL.clear;
SQL.Add(´Select distinct Pedido.Numero, CTRC.DataEmissao,Clientes.Nome as Rem,CTRC.CodRem,Pedido.CodDest,Clientes.Nome as Dest´);
SQL.Add(´From Pedido,Clientes´);
SQL.Add(´left join´);
SQL.Add(´Clientes Rem on (Rem.Codigo = Pedido.CodRem)´);
SQL.Add(´left join´);
SQL.Add(´Clientes Dest on (Dest.Codigo = Pedido.CodDest)´);

mas acontece a mesma coisa, só tem um pedido mas ele traz repetindo o mesmo pedido para cada cliente cadastrado.


GOSTEI 0
Edilcimar

Edilcimar

22/11/2005

Por que tem clientes.nome as rem e clientes.nome as dest?


GOSTEI 0
Janete

Janete

22/11/2005

Por que tem clientes.nome as rem e clientes.nome as dest?


Dá uma olhadinha no primeiro tópico q escrevi, se não entender me fala.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/11/2005

Janete, creio que você tenha feito errado.

Select 
  Ped.Numero, Ped.DataEmissao, 
  Ped.CodRem, Rem.Nome Remetente, 
  Ped.CodDest, Dest.Nome Destinatario 
From 
  Pedido Ped 
left join 
  Clientes Rem on (Rem.Codigo = Ped.CodRem) 
left join 
  Clientes Dest on (Dest.Codigo = Ped.CodDest)


preste atenção na instrução acima: somente a tabela Pedido está na cláusula [i:23b8eb5576]from[/i:23b8eb5576]. Nenhuma outra.

apesar de você não ter informado qual banco de dados está utilizando, essa sintaxe funciona para a maioria deles.


GOSTEI 0
Edilcimar

Edilcimar

22/11/2005

Ok, eu não havia lido o início, mas ainda assim, você vai ter problema ao pegar o cliente(pelo nome) remetente e destinatário, imagine que tenha um remetente José da Silva e um destinatário José da Silva, sendo que o segundo é outra pessoa(coisa pouco provável uma vez que este nome é pouco comum) e aí como é que fica o teu select? Troque o select nome por select codigo da pessoa, depois compare de maneira direta, where remetente.codigo igual ou diferente destinatariio.codigo


GOSTEI 0
Siam

Siam

22/11/2005

Se seu banco aceitar essa sintaxe, acho que deve funcionar:
Select pedido.Numero, pedido.DataEmissao, pedido.CodRem, pedido.CodDest, 
(Select Nome From Clientes Where Codigo = Pedido.CodRem) as Rem,
(Select Nome From Clientes Where Codigo = Pedido.CodDest) as Dest
From pedido



GOSTEI 0
Janete

Janete

22/11/2005

Se seu banco aceitar essa sintaxe, acho que deve funcionar:
Select pedido.Numero, pedido.DataEmissao, pedido.CodRem, pedido.CodDest, 
(Select Nome From Clientes Where Codigo = Pedido.CodRem) as Rem,
(Select Nome From Clientes Where Codigo = Pedido.CodDest) as Dest
From pedido


Fiz dessa forma e ele traz os pedidos certos sem repetir, mas não traz nenhum dos nomes nem do remetente e nem do destinatário, eles ficam em brancos.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/11/2005

Janete, creio que você tenha feito errado.
Select 
  Ped.Numero, Ped.DataEmissao, 
  Ped.CodRem, Rem.Nome Remetente, 
  Ped.CodDest, Dest.Nome Destinatario 
From 
  Pedido Ped 
left join 
  Clientes Rem on (Rem.Codigo = Ped.CodRem) 
left join 
  Clientes Dest on (Dest.Codigo = Ped.CodDest)
preste atenção na instrução acima: somente a tabela Pedido está na cláusula [i:30d0e72882]from[/i:30d0e72882]. Nenhuma outra. apesar de você não ter informado qual banco de dados está utilizando, essa sintaxe funciona para a maioria deles.


isso não funcionou???


GOSTEI 0
Siam

Siam

22/11/2005

Fiz dessa forma e ele traz os pedidos certos sem repetir, mas não traz nenhum dos nomes nem do remetente e nem do destinatário, eles ficam em brancos.
Se ficam em branco é pq nem o remetente e nem o destinatário estão cadastrados na tabela Clientes.


GOSTEI 0
Siam

Siam

22/11/2005

isso não funcionou???
Remetente e destinatário ficam iguais; pelo menos no Interbase.


GOSTEI 0
Janete

Janete

22/11/2005

[quote:5a134989d9=´emerson.en´]Janete, creio que você tenha feito errado.
Select 
  Ped.Numero, Ped.DataEmissao, 
  Ped.CodRem, Rem.Nome Remetente, 
  Ped.CodDest, Dest.Nome Destinatario 
From 
  Pedido Ped 
left join 
  Clientes Rem on (Rem.Codigo = Ped.CodRem) 
left join 
  Clientes Dest on (Dest.Codigo = Ped.CodDest)
preste atenção na instrução acima: somente a tabela Pedido está na cláusula [i:5a134989d9]from[/i:5a134989d9]. Nenhuma outra. apesar de você não ter informado qual banco de dados está utilizando, essa sintaxe funciona para a maioria deles.


isso não funcionou???[/quote:5a134989d9]

Acrescentei a tabela de clientes no From e ficou a mesma coisa. Estou usando paradox.


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/11/2005

acrescentou no from? mas NÃO é pra acrescentar...


GOSTEI 0
Janete

Janete

22/11/2005

acrescentou no from? mas NÃO é pra acrescentar...


Então não entendi o q vc falou...
´preste atenção na instrução acima: somente a tabela Pedido está na cláusula from. Nenhuma outra.

apesar de você não ter informado qual banco de dados está utilizando, essa sintaxe funciona para a maioria deles.´

Mas testei com From Pedido e com Frm Pedidos,Clientes tb não adiantou


GOSTEI 0
Janete

Janete

22/11/2005

Agora está dessa forma:

SQL.Add(´Select Pedido.Numero, Pedido.DataEmissao,Pedido.CodRem,Pedido.CodDest,Clientes.Nome as Rem,Clientes.Nome as Dest´);
SQL.Add(´From Pedido);

SQL.Add(´left join´);
SQL.Add(´Clientes Rem on (Rem.Codigo = Pedido.CodRem)´);
SQL.Add(´left join´);
SQL.Add(´Clientes Dest on (Dest.Codigo = Pedido.CodDest)´);

e está trazendo a quantidade de registro de pedidos certos mas repete cada remetente no destinatário exemplo:

Numero Data Remetente Destinatário
1 23/11/05 Cliente1 Cliente1
2 23/11/05 Cliente2 Cliente2

e o destinatário á outro cliente não é nem o CLiente1 nem o Clinete2, ele simplesmente repete o remetente para o destinatário.


GOSTEI 0
Janete

Janete

22/11/2005

Será que daria algum problema se eu buscar os nomes que quero atraves de um New Field na query buscando em uma table mesmo a tabela de clientes?


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/11/2005

olha, ao que parece o problema está na sua tabela de pedidos. certifique-se que os dados estão gravados corretamente nela.

quais são os dados exibidos em todas as colunas depois que você abre essa consulta?

Numero | DataEmissao | CodRem | CodDest | Rem                  | Dest


outra coisa: deixe as últimas colunas com os nomes inteiros (Remetente e Destinatario). talvez o paradox esteja ´se perdendo´ pois você deixou essas colunas com o mesmo apelido dado à tabela clientes.

deixe o nome completo:
SQL.Clear;
SQL.Add(´Select Pedido.Numero, Pedido.DataEmissao,Pedido.CodRem,Pedido.CodDest,Clientes.Nome as Remetente,Clientes.Nome as Destinatario´); 
SQL.Add(´From Pedido); 
SQL.Add(´left join´); 
SQL.Add(´Clientes Rem on (Rem.Codigo = Pedido.CodRem)´); 
SQL.Add(´left join´); 
SQL.Add(´Clientes Dest on (Dest.Codigo = Pedido.CodDest)´);



GOSTEI 0
Siam

Siam

22/11/2005

Fazendo dois Left Join na tabela de Clientes, o Interbase também repete o mesmo nome p/ rem e dest


GOSTEI 0
Emerson Nascimento

Emerson Nascimento

22/11/2005

claro!!!! acabei de ver aonde está o erro!!!! ô pessoal que não copia do jeito que a gente escreve....

notem que a tabela clientes recebe dois apelidos. é pra usar os apelidos!!!

meu primeiro post:
Select 
  Ped.Numero, Ped.DataEmissao, 
  Ped.CodRem, Rem.Nome Remetente,  <--- REM.Nome
  Ped.CodDest, Dest.Nome Destinatario   <--- DEST.Nome
From 
  Pedido Ped 
left join 
  Clientes Rem on (Rem.Codigo = Ped.CodRem) 
left join 
  Clientes Dest on (Dest.Codigo = Ped.CodDest)


como a Janete colocou:
SQL.Add(´Select Pedido.Numero, Pedido.DataEmissao,Pedido.CodRem,Pedido.CodDest,Clientes.Nome as Rem,Clientes.Nome as Dest´); <-- CLIENTES.Nome ESTÁ ERRADO!!!
SQL.Add(´From Pedido); 
SQL.Add(´left join´); 
SQL.Add(´Clientes Rem on (Rem.Codigo = Pedido.CodRem)´); 
SQL.Add(´left join´); 
SQL.Add(´Clientes Dest on (Dest.Codigo = Pedido.CodDest)´);


[size=18:760ee602bd]O CORRETO:[/size:760ee602bd]
SQL.Clear; 
SQL.Add(´Select Pedido.Numero, Pedido.DataEmissao,Pedido.CodRem,Pedido.CodDest,Rem.Nome as Remetente,Dest.Nome as Destinatario´); 
SQL.Add(´From Pedido); 
SQL.Add(´left join´); 
SQL.Add(´Clientes Rem on (Rem.Codigo = Pedido.CodRem)´); 
SQL.Add(´left join´); 
SQL.Add(´Clientes Dest on (Dest.Codigo = Pedido.CodDest)´);


se tem duas vezes a tabela clientes, mas com apelidos diferentes, é pra ser usado o APELIDO e não o nome da tabela!!!


GOSTEI 0
POSTAR