Juntar duas consultas SQL em uma
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]
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
Curtidas 0
Respostas
Paullsoftware
20/03/2006
já tentou assim:
não testei mais deve funcionar! :wink:
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
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 ?
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
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
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.
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
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
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
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
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
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.
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
20/03/2006
Vc testou individualmente os 2 SELECTs?
GOSTEI 0
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.
Inclusive funcionou o UNION, só q com outros campos da tabela e não com o NOME e CONJUGE.
GOSTEI 0
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:
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
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.
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
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
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.
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
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
20/03/2006
Quero agradecer a colaboração dos colegas, especialmente para Galdalf.nho.
Com a SP deu certinho. :D
Obrigaduuuuuuu!
Marcello.
Com a SP deu certinho. :D
Obrigaduuuuuuu!
Marcello.
GOSTEI 0
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.
(SELECT 1 FROM minha_tabela)
UNION ALL
(SELECT 2 FROM minha_tabela)
no POSTGRES funciona.
GOSTEI 0
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!
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