Juntar duas consultas SQL em uma

Firebird

20/03/2006

Caros colegas,

Gostaria de transformar os dois Selects abaixo em apenas um.

Select NOME, ENDERECO, BAIRRO, CEP, CIDADE, UF, NASC, OBS, FONE
from CADCLI
Where extract(day from NASC) between :diaIni and :diaFim
and extract(month from NASC) between :mesIni and :mesFim;


Select CONJUGE, ENDERECO, BAIRRO, CEP, CIDADE, UF, NAS_CO, OBS, FONE
from CADCLI
Where extract(day from NAS_CO) between :diaIni and :diaFim
and extract(month from NAS_CO) between :mesIni and :mesFim;


Ou seja, verifico o nascimento do cliente ou do conjuge para ver se um
deles esta fazendo aniver e gostaria de ter apenas 1 dataset para os
relatórios.

Obrigado,

Marcello.

[color=green:718a13af9d]Movido de Delphi para Interbase/Firebird[/color:718a13af9d]


Marcello

Marcello

Curtidas 0

Respostas

Paullsoftware

Paullsoftware

20/03/2006

já tentou assim:

Select NOME, CONJUGE, ENDERECO, BAIRRO, CEP, CIDADE, UF, NASC, NAS_CO,OBS, FONE 
from CADCLI 
Where
    extract(day from NASC) between :diCli and :dfCli
and
    extract(month from NASC) between :miCli and :mfCli 
and 
   extract(day from NAS_CO) between :diCo and :dfCo
and
   extract(month from NAS_CO) between :miCo and :mfCo


não testei mais deve funcionar! :wink:


GOSTEI 0
Marcello

Marcello

20/03/2006

O problema é q vou usar estes dados para emitir cartas de aniversário, ou para o cliente ou para o seu conjugê - quem estiver aniversariando. Então o campo nome teria q armazenar um dos dois.
Não me adianta ter um dataset com o Nome e o Conjugê.

Vc tem alguma idéia para esta situação ?


GOSTEI 0
Gandalf.nho

Gandalf.nho

20/03/2006

Select NOME, ENDERECO, BAIRRO, CEP, CIDADE, UF, NASC, OBS, FONE 
from CADCLI 
Where extract(day from NASC) between :diaIni and :diaFim 
and extract(month from NASC) between :mesIni and :mesFim
UNION
Select CONJUGE, ENDERECO, BAIRRO, CEP, CIDADE, UF, NAS_CO, OBS, FONE 
from CADCLI 
Where extract(day from NAS_CO) between :diaIni and :diaFim 
and extract(month from NAS_CO) between :mesIni and :mesFim



GOSTEI 0
Marcello

Marcello

20/03/2006

Galdalf.nho,

Não consegui rodar este SQL com UNION. Ainda estou usando Interbase 6, será isso ?

O erro é SQL error code = -104. Token unknown.


GOSTEI 0
Marcello

Marcello

20/03/2006

Caros colegas,

Descobri q não posso usar UNION pois apesar dos dados serem de mesmo tipo e tamanho, seus nomes são diferentes - NOME/CONJUGE e NASC/NAS_CO.

Será q alguém tem alguma outra idéia ? :cry:

Obrigado.

Marcello


GOSTEI 0
Thiago Vidal

Thiago Vidal

20/03/2006

já tentou... ?

Select NOME, ENDERECO, BAIRRO, CEP, CIDADE, UF, NASC, OBS,
...
UNION
Select CONJUGE as NOME, ENDERECO, BAIRRO, CEP, CIDADE, UF, NAS_CO as NASC, OBS,
...



GOSTEI 0
Gandalf.nho

Gandalf.nho

20/03/2006

O nome dos campos não tem nada a ver, o importante é serem do mesmo tipo e tamanho. Experimente UNION ALL ao invés de UNION


GOSTEI 0
Marcello

Marcello

20/03/2006

Cara, tá complicado !!!

Realmente os nome dos campos não tem nada a ver.
Troquei os campos NOME e CONJUGE por outros dois (PAI e MAE) e mantive NASC e NAS_CO e funcionou perfeitamente.

Só q se eu volto os campos NOME (VARCHAR(50)) e CONJUGE (VARCHAR(50)) da o erro Token unknown.

Realmente não sei mais o q fazer. :cry:

Gostaria q se alguém passou por isto me desse uma luz.

Marcello.


GOSTEI 0
Gandalf.nho

Gandalf.nho

20/03/2006

Vc testou individualmente os 2 SELECTs?


GOSTEI 0
Marcello

Marcello

20/03/2006

Sim, testei os dois selects e deu certinho.
Inclusive funcionou o UNION, só q com outros campos da tabela e não com o NOME e CONJUGE.


GOSTEI 0
Digitom

Digitom

20/03/2006

Select NOME, ENDERECO, BAIRRO, CEP, CIDADE, UF, NASC, OBS, FONE
from [color=red:712f1e7e8c]CADCLI[/color:712f1e7e8c]
Where extract(day from NASC) between :diaIni and :diaFim
and extract(month from NASC) between :mesIni and :mesFim;

Select CONJUGE, ENDERECO, BAIRRO, CEP, CIDADE, UF, NAS_CO, OBS, FONE
from [color=red:712f1e7e8c]CADCLI[/color:712f1e7e8c]
Where extract(day from NAS_CO) between :diaIni and :diaFim
and extract(month from NAS_CO) between :mesIni and :mesFim;

Não sei se você colou e copiou os arquivos aqui, mas veja que no seus FROM voce colocou CADCLI para os conjuges e para cadcli.
Se realmente for CADCLI para dois FROMs utilize assim



Select [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]NOME, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]ENDERECO, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]BAIRRO, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]CEP, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]CIDADE, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]UF, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]NASC, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]OBS, [color=red:712f1e7e8c]cli.[/color:712f1e7e8c]FONE
from CADCLI [color=red:712f1e7e8c]cli[/color:712f1e7e8c]
Where extract(day from NASC) between :diaIni and :diaFim
and extract(month from NASC) between :mesIni and :mesFim;

Select [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]CONJUGE, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]ENDERECO, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]BAIRRO, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]CEP, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]CIDADE, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]UF, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]NAS_CO, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]OBS, [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]FONE
from CADCLI [color=red:712f1e7e8c]conj.[/color:712f1e7e8c]
Where extract(day from NAS_CO) between :diaIni and :diaFim
and extract(month from NAS_CO) between :mesIni and :mesFim;



Veja meu exemplo é quase o mesmo, usando o firebird, e deu certo:

Select clicod, clirazao, clidatacadast, ´cliente´ as Tabela from clientes Where extract(day from clidatacadast) between :diaIni and :diaFim and extract(month from clidatacadast) between :mesIni and :mesFim union Select balccod, balcnome, balccad, ´balconi´ as tabela from balconistas Where extract(day from balccad) between :diaIni and :diaFim and extract(month from balccad) between :mesIni and :mesFim



GOSTEI 0
Marcello

Marcello

20/03/2006

Tentei cfe o digitom sugeriu e nada - o erro persiste.

Interessante foi q troquei o Firebird 1.5.2.4731 pelo Firebird 2.0 beta 2 e daí funcionou com uma ressalva - ele trouxe um registro com todos os campos null (não existem registros null na minha tabela).

To abandonando o UNION - vou tentar de outro jeito.

Agradeço os colegas.

Marcello.


GOSTEI 0
Gandalf.nho

Gandalf.nho

20/03/2006

Estranho isso, deveria funcionar. Bem, uma alternativa ao UNION que vc pode tentar é usar uma SP para unir os SELECTs.


GOSTEI 0
Marcello

Marcello

20/03/2006

gandalf.nho

Vc poderia me dar um exemplo de SP unindo selects ?

Havia pensado nisto, mas não tenho muita experiência em SP e não consegui fazer. :oops:

Obrigado,

Marcello.


GOSTEI 0
Gandalf.nho

Gandalf.nho

20/03/2006

Vc pode tentar algo assim no corpo da SP:

FOR Select NOME, ENDERECO, BAIRRO, CEP, CIDADE, UF, NASC, OBS, FONE from CADCLI Where extract(day from NASC) between :diaIni and :diaFim and extract(month from NASC) between :mesIni and :mesFim INTO  :NOME, :ENDERECO, :BAIRRO, :CEP, :CIDADE, :UF, :NASC, :OBS,  :FONE DO
  SUSPEND;
FOR Select CONJUGE, ENDERECO, BAIRRO, CEP, CIDADE, UF, NAS_CO, OBS, FONE from CADCLI Where extract(day from NAS_CO) between :diaIni and :diaFim and extract(month from NAS_CO) between :mesIni and :mesFim INTO  :NOME, :ENDERECO, :BAIRRO, :CEP, :CIDADE, :UF, :NASC, :OBS,  :FONE DO
  SUSPEND;



GOSTEI 0
Marcello

Marcello

20/03/2006

Quero agradecer a colaboração dos colegas, especialmente para Galdalf.nho.
Com a SP deu certinho. :D

Obrigaduuuuuuu!

Marcello.


GOSTEI 0
Alain Frantz

Alain Frantz

20/03/2006

Experimente separar as SQLs com parênteses "()". Fica assim:

(SELECT 1 FROM minha_tabela)
UNION ALL
(SELECT 2 FROM minha_tabela)

no POSTGRES funciona.
GOSTEI 0
Jaquisson

Jaquisson

20/03/2006

Ressuscitando o tópico...

Mas para quem ainda tiver dúvida segue outro exemplo:
SELECT
c_receber.vencimento_d1 AS "DATA",
c_receber.cobranca AS "COBRANCA",
sum(c_receber.valor_original) AS "TOTAL"

FROM
c_receber

INNER JOIN
c_receber_manual on (c_receber.Vencimento_D1 = c_receber_manual.data)

GROUP BY vencimento_d1, COBRANCA

UNION ALL

SELECT
c_receber_manual.data AS "DATA",
c_receber_manual.descrição AS "COBRANCA",
c_receber_manual.valor AS "TOTAL"

FROM
c_receber_manual


Quebrei um pouco a cabeça mas deu certo.

Hug!
GOSTEI 0
POSTAR