Registros Duplicados no Resultado do Select
Galera eu estou fazendo um select e meus registros estão duplando mesmo eu colocando o DISTINCT, eu utilizo o firebird 2.5.
Eu tenho a seguite view
E em cima desta viu eu criei uma Store Procedure para fazer um consulta em vários campos da view.
Mas os registros estão duplicando. O que pode ser? Já tentei fazer de outras formas mas eles estão duplicando do mesmo jeito.
Eu tenho a seguite view
CREATE OR ALTER VIEW VW_CLIENTES(
CLI_ID,
CLI_NOME,
CLI_ENDERECO,
CLI_NUMERO,
CLI_BAIRRO,
CLI_CIDADE,
CLI_CEP,
CLI_UF,
CLI_FONE1,
CLI_FONE2,
CLI_FONE3,
CLI_FAX,
CLI_RG,
CLI_CPF_CNPJ,
CLI_MAIL,
CLI_SITE,
CLI_LIMITE,
CLI_SALDO,
CLI_TIPO,
CLI_TABELA,
STATUS,
CLI_FOTO,
CLI_OBS,
DATA_CAD,
DATA_ALT,
CLI_NASCIMENTO,
CLI_CREDITOCONSUMO,
CLI_CREDITOTIPO,
CLI_RAZAO,
CLI_VALIDADECARTAO,
CLI_COMPLEMENTO,
CLI_CONTATO,
CLI_CATEGORIA,
CLI_CLASSE,
CLI_LOGIN,
CLI_SENHA,
CLI_VENDAS,
CLI_SUFRAMA,
USU_ID,
USU_LOGIN,
LOJ_ID,
DATA_BLOQUEIO,
MOTIVO_BLOQUEIO,
DATA_DESBLOQUEIO,
MOTIVO_DESBLOQUEIO,
ROT_ID,
ROT_DESCRICAO,
ARE_DESCRICAO,
SET_DESCRICAO,
CLI_INTINERARIO,
ISENTO_ICMS)
AS
select distinct
clientes.cli_id,
clientes.cli_nome,
clientes.cli_endereco,
clientes.cli_numero,
clientes.cli_bairro,
clientes.cli_cidade,
clientes.cli_cep,
clientes.cli_uf,
clientes.cli_fone1,
clientes.cli_fone2,
clientes.cli_fone3,
clientes.cli_fax,
clientes.cli_rg,
clientes.cli_cpf_cnpj,
clientes.cli_mail,
clientes.cli_site,
clientes.cli_limite,
clientes.cli_saldo,
clientes.cli_tipo,
clientes.cli_tabela,
case clientes.status
when 0 then ATIVO
when 1 then INATIVO
when 2 then BLOQUEADO
end as STATUS,
clientes.cli_foto,
clientes.cli_obs,
clientes.data_cad,
clientes.data_alt,
clientes.cli_nascimento,
clientes.cli_creditoconsumo,
clientes.cli_creditotipo,
clientes.cli_razao,
clientes.cli_validadecartao,
clientes.cli_complemento,
clientes.cli_contato,
clientes.cli_categoria,
clientes.cli_classe,
clientes.cli_login,
clientes.cli_senha,
clientes.cli_vendas,
clientes.cli_suframa,
clientes.usu_id,
usuarios.usu_login,
clientes.loj_id,
clientes.data_bloqueio,
clientes.motivo_bloqueio,
clientes.data_desbloqueio,
clientes.motivo_desbloqueio,
clientes.rot_id,
rotas.rot_descricao,
areas.are_descricao,
setores.set_descricao,
clientes.cli_intinerario,
clientes.isento_icms
from setores
inner join rotas
on (rotas.rot_id = setores.rota1)
or (rotas.rot_id = setores.rota2)
or (rotas.rot_id = setores.rota3)
or (rotas.rot_id = setores.rota4)
or (rotas.rot_id = setores.rota5)
or (rotas.rot_id = setores.rota6)
or (rotas.rot_id = setores.rota7)
inner join areas on areas.are_id = setores.are_id
inner join clientes on clientes.rot_id = rotas.rot_id
left join usuarios on usuarios.usu_id = clientes.usu_id
;
E em cima desta viu eu criei uma Store Procedure para fazer um consulta em vários campos da view.
CREATE OR ALTER PROCEDURE SP_CLIENTES_CONSULTA (
cliente varchar(50))
returns (
cli_id integer,
cli_nome varchar(50),
cli_endereco varchar(70),
cli_numero varchar(5),
cli_bairro varchar(50),
cli_cidade varchar(50),
cli_cep varchar(10),
cli_uf varchar(2),
cli_fone1 varchar(50),
cli_fone2 varchar(50),
cli_fone3 varchar(50),
cli_fax varchar(50),
cli_rg varchar(20),
cli_cpf_cnpj varchar(21),
cli_mail varchar(100),
cli_site varchar(100),
cli_limite numeric(18,2),
cli_saldo numeric(18,2),
cli_tipo integer,
cli_tabela integer,
status char(9),
cli_foto blob sub_type 0 segment size 80,
cli_obs blob sub_type 0 segment size 80,
data_cad timestamp,
data_alt timestamp,
cli_nascimento date,
cli_creditoconsumo numeric(18,2),
cli_creditotipo integer,
cli_razao varchar(50),
cli_validadecartao date,
cli_complemento varchar(20),
cli_contato varchar(50),
cli_categoria varchar(50),
cli_classe varchar(50),
cli_login varchar(100),
cli_senha varchar(50),
cli_vendas numeric(18,2),
cli_suframa varchar(30),
usu_id integer,
usu_login varchar(20),
loj_id integer,
data_bloqueio timestamp,
motivo_bloqueio blob sub_type 0 segment size 80,
data_desbloqueio timestamp,
motivo_desbloqueio blob sub_type 0 segment size 80,
rot_id integer,
rot_descricao varchar(30),
are_descricao varchar(50),
set_descricao varchar(50),
cli_intinerario integer,
isento_icms integer)
as
BEGIN
FOR /* CONSULTA PELA RAZAO SOCIAL */
select
cli_id,
cli_nome,
cli_endereco,
cli_numero,
cli_bairro,
cli_cidade,
cli_cep,
cli_uf,
cli_fone1,
cli_fone2,
cli_fone3,
cli_fax,
cli_rg,
cli_cpf_cnpj,
cli_mail,
cli_site,
cli_limite,
cli_saldo,
cli_tipo,
cli_tabela,
status,
cli_foto,
cli_obs,
data_cad,
data_alt,
cli_nascimento,
cli_creditoconsumo,
cli_creditotipo,
cli_razao,
cli_validadecartao,
cli_complemento,
cli_contato,
cli_categoria,
cli_classe,
cli_login,
cli_senha,
cli_vendas,
cli_suframa,
usu_id,
usu_login,
loj_id,
data_bloqueio,
motivo_bloqueio,
data_desbloqueio,
motivo_desbloqueio,
rot_id,
rot_descricao,
are_descricao,
set_descricao,
cli_intinerario,
isento_icms
from
vw_clientes
where
cli_razao LIKE % || :CLIENTE || %
UNION ALL
/* CONSULTA PELO NOME FANTASIA */
select
cli_id,
cli_nome,
cli_endereco,
cli_numero,
cli_bairro,
cli_cidade,
cli_cep,
cli_uf,
cli_fone1,
cli_fone2,
cli_fone3,
cli_fax,
cli_rg,
cli_cpf_cnpj,
cli_mail,
cli_site,
cli_limite,
cli_saldo,
cli_tipo,
cli_tabela,
status,
cli_foto,
cli_obs,
data_cad,
data_alt,
cli_nascimento,
cli_creditoconsumo,
cli_creditotipo,
cli_razao,
cli_validadecartao,
cli_complemento,
cli_contato,
cli_categoria,
cli_classe,
cli_login,
cli_senha,
cli_vendas,
cli_suframa,
usu_id,
usu_login,
loj_id,
data_bloqueio,
motivo_bloqueio,
data_desbloqueio,
motivo_desbloqueio,
rot_id,
rot_descricao,
are_descricao,
set_descricao,
cli_intinerario,
isento_icms
from
vw_clientes
where
cli_nome LIKE % || :CLIENTE || %
UNION ALL
/* CONSULTA PELO CPF OU CNPJ */
select distinct
cli_id,
cli_nome,
cli_endereco,
cli_numero,
cli_bairro,
cli_cidade,
cli_cep,
cli_uf,
cli_fone1,
cli_fone2,
cli_fone3,
cli_fax,
cli_rg,
cli_cpf_cnpj,
cli_mail,
cli_site,
cli_limite,
cli_saldo,
cli_tipo,
cli_tabela,
status,
cli_foto,
cli_obs,
data_cad,
data_alt,
cli_nascimento,
cli_creditoconsumo,
cli_creditotipo,
cli_razao,
cli_validadecartao,
cli_complemento,
cli_contato,
cli_categoria,
cli_classe,
cli_login,
cli_senha,
cli_vendas,
cli_suframa,
usu_id,
usu_login,
loj_id,
data_bloqueio,
motivo_bloqueio,
data_desbloqueio,
motivo_desbloqueio,
rot_id,
rot_descricao,
are_descricao,
set_descricao,
cli_intinerario,
isento_icms
from
vw_clientes
where
cli_cpf_cnpj LIKE % || :CLIENTE || %
UNION ALL
/* CONSULTA PELO CODIGO */
select
cli_id,
cli_nome,
cli_endereco,
cli_numero,
cli_bairro,
cli_cidade,
cli_cep,
cli_uf,
cli_fone1,
cli_fone2,
cli_fone3,
cli_fax,
cli_rg,
cli_cpf_cnpj,
cli_mail,
cli_site,
cli_limite,
cli_saldo,
cli_tipo,
cli_tabela,
status,
cli_foto,
cli_obs,
data_cad,
data_alt,
cli_nascimento,
cli_creditoconsumo,
cli_creditotipo,
cli_razao,
cli_validadecartao,
cli_complemento,
cli_contato,
cli_categoria,
cli_classe,
cli_login,
cli_senha,
cli_vendas,
cli_suframa,
usu_id,
usu_login,
loj_id,
data_bloqueio,
motivo_bloqueio,
data_desbloqueio,
motivo_desbloqueio,
rot_id,
rot_descricao,
are_descricao,
set_descricao,
cli_intinerario,
isento_icms
from
vw_clientes
where
vw_clientes.cli_id = (SELECT RESULTADO FROM EXTRAI_INTEIRO(:CLIENTE))
INTO :CLI_ID,
:CLI_NOME,
:CLI_ENDERECO,
:CLI_NUMERO,
:CLI_BAIRRO,
:CLI_CIDADE,
:CLI_CEP,
:CLI_UF,
:CLI_FONE1,
:CLI_FONE2,
:CLI_FONE3,
:CLI_FAX,
:CLI_RG,
:CLI_CPF_CNPJ,
:CLI_MAIL,
:CLI_SITE,
:CLI_LIMITE,
:CLI_SALDO,
:CLI_TIPO,
:CLI_TABELA,
:STATUS,
:CLI_FOTO,
:CLI_OBS,
:DATA_CAD,
:DATA_ALT,
:CLI_NASCIMENTO,
:CLI_CREDITOCONSUMO,
:CLI_CREDITOTIPO,
:CLI_RAZAO,
:CLI_VALIDADECARTAO,
:CLI_COMPLEMENTO,
:CLI_CONTATO,
:CLI_CATEGORIA,
:CLI_CLASSE,
:CLI_LOGIN,
:CLI_SENHA,
:CLI_VENDAS,
:CLI_SUFRAMA,
:USU_ID,
:USU_LOGIN,
:LOJ_ID,
:DATA_BLOQUEIO,
:MOTIVO_BLOQUEIO,
:DATA_DESBLOQUEIO,
:MOTIVO_DESBLOQUEIO,
:ROT_ID,
:ROT_DESCRICAO,
:ARE_DESCRICAO,
:SET_DESCRICAO,
:CLI_INTINERARIO,
:ISENTO_ICMS
DO
BEGIN
SUSPEND;
END
END
Mas os registros estão duplicando. O que pode ser? Já tentei fazer de outras formas mas eles estão duplicando do mesmo jeito.
Sidney Abreu
Curtidas 0
Respostas
Wilson Junior
03/11/2011
Está duplicando porque vc faz UNION ALL. Lhe aconselho a fazer uma SP para cada tipo de consulta (RazaoSocial, NomeFantasia, etc.).
Espero ter colaborado.
Espero ter colaborado.
GOSTEI 0
Emerson Nascimento
03/11/2011
tente com esta alteração.
mas você precisa GARANTIR QUE HÁ SOMENTE 1 SETOR E 1 AREA PARA CADA ROTA, caso contrário você terá registros duplicados, visto que você quer exibir o setor e a áera na consulta.
CREATE OR ALTER VIEW VW_CLIENTES(
CLI_ID,
CLI_NOME,
CLI_ENDERECO,
CLI_NUMERO,
CLI_BAIRRO,
CLI_CIDADE,
CLI_CEP,
CLI_UF,
CLI_FONE1,
CLI_FONE2,
CLI_FONE3,
CLI_FAX,
CLI_RG,
CLI_CPF_CNPJ,
CLI_MAIL,
CLI_SITE,
CLI_LIMITE,
CLI_SALDO,
CLI_TIPO,
CLI_TABELA,
STATUS,
CLI_FOTO,
CLI_OBS,
DATA_CAD,
DATA_ALT,
CLI_NASCIMENTO,
CLI_CREDITOCONSUMO,
CLI_CREDITOTIPO,
CLI_RAZAO,
CLI_VALIDADECARTAO,
CLI_COMPLEMENTO,
CLI_CONTATO,
CLI_CATEGORIA,
CLI_CLASSE,
CLI_LOGIN,
CLI_SENHA,
CLI_VENDAS,
CLI_SUFRAMA,
USU_ID,
USU_LOGIN,
LOJ_ID,
DATA_BLOQUEIO,
MOTIVO_BLOQUEIO,
DATA_DESBLOQUEIO,
MOTIVO_DESBLOQUEIO,
ROT_ID,
ROT_DESCRICAO,
ARE_DESCRICAO,
SET_DESCRICAO,
CLI_INTINERARIO,
ISENTO_ICMS)
AS
select distinct
clientes.cli_id,
clientes.cli_nome,
clientes.cli_endereco,
clientes.cli_numero,
clientes.cli_bairro,
clientes.cli_cidade,
clientes.cli_cep,
clientes.cli_uf,
clientes.cli_fone1,
clientes.cli_fone2,
clientes.cli_fone3,
clientes.cli_fax,
clientes.cli_rg,
clientes.cli_cpf_cnpj,
clientes.cli_mail,
clientes.cli_site,
clientes.cli_limite,
clientes.cli_saldo,
clientes.cli_tipo,
clientes.cli_tabela,
case clientes.status
when 0 then ATIVO
when 1 then INATIVO
when 2 then BLOQUEADO
end as STATUS,
clientes.cli_foto,
clientes.cli_obs,
clientes.data_cad,
clientes.data_alt,
clientes.cli_nascimento,
clientes.cli_creditoconsumo,
clientes.cli_creditotipo,
clientes.cli_razao,
clientes.cli_validadecartao,
clientes.cli_complemento,
clientes.cli_contato,
clientes.cli_categoria,
clientes.cli_classe,
clientes.cli_login,
clientes.cli_senha,
clientes.cli_vendas,
clientes.cli_suframa,
clientes.usu_id,
usuarios.usu_login,
clientes.loj_id,
clientes.data_bloqueio,
clientes.motivo_bloqueio,
clientes.data_desbloqueio,
clientes.motivo_desbloqueio,
clientes.rot_id,
rotas.rot_descricao,
areas.are_descricao,
setores.set_descricao,
clientes.cli_intinerario,
clientes.isento_icms
from clientes
inner join rotas on rotas.rot_id = clientes.rot_id
inner join on setores
on (setores.rota1 = rotas.rot_id)
or (setores.rota2 = rotas.rot_id)
or (setores.rota3 = rotas.rot_id)
or (setores.rota4 = rotas.rot_id)
or (setores.rota5 = rotas.rot_id)
or (setores.rota6 = rotas.rot_id)
or (setores.rota7 = rotas.rot_id)
inner join areas on areas.are_id = setores.are_id
left join usuarios on usuarios.usu_id = clientes.usu_id;
mas você precisa GARANTIR QUE HÁ SOMENTE 1 SETOR E 1 AREA PARA CADA ROTA, caso contrário você terá registros duplicados, visto que você quer exibir o setor e a áera na consulta.
CREATE OR ALTER VIEW VW_CLIENTES(
CLI_ID,
CLI_NOME,
CLI_ENDERECO,
CLI_NUMERO,
CLI_BAIRRO,
CLI_CIDADE,
CLI_CEP,
CLI_UF,
CLI_FONE1,
CLI_FONE2,
CLI_FONE3,
CLI_FAX,
CLI_RG,
CLI_CPF_CNPJ,
CLI_MAIL,
CLI_SITE,
CLI_LIMITE,
CLI_SALDO,
CLI_TIPO,
CLI_TABELA,
STATUS,
CLI_FOTO,
CLI_OBS,
DATA_CAD,
DATA_ALT,
CLI_NASCIMENTO,
CLI_CREDITOCONSUMO,
CLI_CREDITOTIPO,
CLI_RAZAO,
CLI_VALIDADECARTAO,
CLI_COMPLEMENTO,
CLI_CONTATO,
CLI_CATEGORIA,
CLI_CLASSE,
CLI_LOGIN,
CLI_SENHA,
CLI_VENDAS,
CLI_SUFRAMA,
USU_ID,
USU_LOGIN,
LOJ_ID,
DATA_BLOQUEIO,
MOTIVO_BLOQUEIO,
DATA_DESBLOQUEIO,
MOTIVO_DESBLOQUEIO,
ROT_ID,
ROT_DESCRICAO,
ARE_DESCRICAO,
SET_DESCRICAO,
CLI_INTINERARIO,
ISENTO_ICMS)
AS
select distinct
clientes.cli_id,
clientes.cli_nome,
clientes.cli_endereco,
clientes.cli_numero,
clientes.cli_bairro,
clientes.cli_cidade,
clientes.cli_cep,
clientes.cli_uf,
clientes.cli_fone1,
clientes.cli_fone2,
clientes.cli_fone3,
clientes.cli_fax,
clientes.cli_rg,
clientes.cli_cpf_cnpj,
clientes.cli_mail,
clientes.cli_site,
clientes.cli_limite,
clientes.cli_saldo,
clientes.cli_tipo,
clientes.cli_tabela,
case clientes.status
when 0 then ATIVO
when 1 then INATIVO
when 2 then BLOQUEADO
end as STATUS,
clientes.cli_foto,
clientes.cli_obs,
clientes.data_cad,
clientes.data_alt,
clientes.cli_nascimento,
clientes.cli_creditoconsumo,
clientes.cli_creditotipo,
clientes.cli_razao,
clientes.cli_validadecartao,
clientes.cli_complemento,
clientes.cli_contato,
clientes.cli_categoria,
clientes.cli_classe,
clientes.cli_login,
clientes.cli_senha,
clientes.cli_vendas,
clientes.cli_suframa,
clientes.usu_id,
usuarios.usu_login,
clientes.loj_id,
clientes.data_bloqueio,
clientes.motivo_bloqueio,
clientes.data_desbloqueio,
clientes.motivo_desbloqueio,
clientes.rot_id,
rotas.rot_descricao,
areas.are_descricao,
setores.set_descricao,
clientes.cli_intinerario,
clientes.isento_icms
from clientes
inner join rotas on rotas.rot_id = clientes.rot_id
inner join on setores
on (setores.rota1 = rotas.rot_id)
or (setores.rota2 = rotas.rot_id)
or (setores.rota3 = rotas.rot_id)
or (setores.rota4 = rotas.rot_id)
or (setores.rota5 = rotas.rot_id)
or (setores.rota6 = rotas.rot_id)
or (setores.rota7 = rotas.rot_id)
inner join areas on areas.are_id = setores.are_id
left join usuarios on usuarios.usu_id = clientes.usu_id;
GOSTEI 0