Fórum Pesquisa em duas tabelas iguais #260992

02/12/2004

0

Boa tarde a todos.

Possuo duas tabelas, VendaHj e VendaAnt, ambas possuem os mesmos campos. Durante o dia eu gravo os dados na tabela VendaHj, e no fim do dia eu pego os dados e transfiro para VendaAnt.

Só que agora estou precisando tirar um relatório de vendas dos dias anteriores até o dia de hj, ou seja, uma consulta nas duas tabelas ao mesmo tempo.

Eis a minha dúvida: Como fazer a consulta nas duas tabelas ao mesmo tempo ? Se possível, coloquem um exemplo com query.

Meu BD é o Mysql 3.23.46, uso o Zeos para acessá-lo e Delphi 5 como ferramenta de desenvolvimento.

Grato pela atenção.


Turbo Drive

Turbo Drive

Responder

Posts

02/12/2004

Paulo_amorim

Olá

Pode-se utilizar o comando UNION...

SELECT * FROM tab1
UNION ALL
SELECT * FROM tab2

Isso irá juntar os 2 resultsets... repare que só se pode fazer union se os campos estiverem em quantidades iguais e tipos iguais ... como você disse que os campos das tabelas são idênticos, não há com o que se preocupar

Espero que ajude
Até+


Responder

Gostei + 0

02/12/2004

Turbo Drive

Agradeço a sua ajuda Paulo, mas a cláusula Union eu já conhecia, só que não consigo usar juntamente com as queries. Além do mais, eu não quero pegar todos os campos, só alguns.

Ex:

QTeste.close;
QTeste.sql.clear;
QTeste.sql.add(´(select CodigoItem, diavenda from VendaHj) union (select CodigoItem, diavenda from VendaAnt) where diavenda >=:inicio and diavenda <=:fim order by diavenda´);
QTeste.parambyname(´inicio´).asdatetime := strtodate(´30/11/04´);
QTeste.parambyname(´fim´).asdatetime := strtodate(´01/12/04´);
QTeste.open;

Eu tentei este código e está me retornando erro de sintaxe. Poderia me informar onde eu estou errando ?

Grato pela atenção.


Responder

Gostei + 0

02/12/2004

Paulo_amorim

Olá

Seu where está fora de qualquer query. Está ´solto´ na sintaxe, por isso o erro. No caso, vc poderia fazer:
1- Colocar esse where nas 2 queries
(SELECT <campos> FROM tabela1 WHERE <condicao>) UNION (SELECT <campos> FROM tabela2 WHERE <campos>)

2- Fazer um select nessas 2 tabelas juntas e depois aplicar o filtro
SELECT * FROM(SELECT <campos> FROM tabela1 UNION SELECT <campos> FROM tabela2) WHERE <condicao>


Como você afirmou que está trabalhando com MySQL3.x , ele não deve aceitar subselects e, portanto, deve-se usar a opção 1, que imagino funciona

Espero que ajude
Até+


Responder

Gostei + 0

03/12/2004

Turbo Drive

Tentei o seguinte código:

QTeste.close;
QTeste.sql.clear;
QTeste.sql.add(´(select CodigoItem, diavenda from VendaHj where diavenda >=:inicio and diavenda <=:fim order by diavenda) union (select CodigoItem, diavenda from VendaAnt where diavenda >=:inicio and diavenda <=:fim order by diavenda) ´);
QTeste.parambyname(´inicio´).asdatetime := strtodate(´30/11/04´);
QTeste.parambyname(´fim´).asdatetime := strtodate(´01/12/04´);
QTeste.open;

Mas infelizmente, não deu certo.

Caso alguém tenha alguma sugestão, fico agradecido.


Responder

Gostei + 0

03/12/2004

Aroldo Zanela

Colega,

Use [b:4e5a6e99b9]Union All[/b:4e5a6e99b9] e o [b:4e5a6e99b9]order by [/b:4e5a6e99b9]deve ser único no final de todas as uniões.

select CodigoItem, diavenda
from VendaHj
where diavenda >= :inicio and diavenda <= :fim
union all
select CodigoItem, diavenda
from VendaAnt
where diavenda >= :inicio and diavenda <= :fim
order by diavenda



Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar