Pesquisa em duas tabelas iguais

Delphi

02/12/2004

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

Curtidas 0

Respostas

Paulo_amorim

Paulo_amorim

02/12/2004

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é+


GOSTEI 0
Turbo Drive

Turbo Drive

02/12/2004

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.


GOSTEI 0
Paulo_amorim

Paulo_amorim

02/12/2004

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é+


GOSTEI 0
Turbo Drive

Turbo Drive

02/12/2004

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.


GOSTEI 0
Aroldo Zanela

Aroldo Zanela

02/12/2004

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



GOSTEI 0
POSTAR