Fórum Utilizando o distinct para um campo #47426
13/10/2004
0
SELECT CMP1, CMP2, CMP3, DISTINCT (CMP4) FROM TABELA
porém não funciona só funciona assim
SELECT DISTINCT CMP1, CMP2, CMP3,CMP4 FROM TABELA
alguem me ajude ...
Sremulador
Curtir tópico
+ 0Posts
13/10/2004
Afarias
T+
Gostei + 0
14/10/2004
Sremulador
Gostei + 0
14/10/2004
Afarias
T+
Gostei + 0
14/10/2004
Sremulador
ex:
EXTRUTURA DA TABELA
CDTB, = TABELA
CDCD, = COD
CDDS = DESDRIÇÃO
DADOS
CDTB, CDCD
1 1
1 2
1 3
1 4
1 5
1 6
2 1
2 2
2 3
2 4
2 5
2 6
2 7
2 8
Sendo que quero o seguinte resultado
1 1
1 2
1 3
1 4
1 5
1 6
2 7
2 8
pois os do campo CDCD não podem se repetir, tem que ser unicos caso contrario ira aparecer duas descrição na lista...
Valeu
Gostei + 0
15/10/2004
Afarias
set term ^; create procedure nome_proc returns (cdtb integer, cdcd integer, cdds varchar(50)) as begin for select cdtb, cdcd, cdds from tabela order by cdtb, cdcd into :cdtb, :cdcd, :cdds do begin if (not exists(select 1 from tabela where cdtb<:cdtb and cdcd=:cdcd) then suspend; end end^
aproveitando, sem querer aprofundar no caso... me parece haver um ´problema´ no seu modelo de dados -- sugiro q faça uma ´revisão´ caso seja possível
T+
Gostei + 0
15/10/2004
Sremulador
O que seria esta revisão em que parte ?
Quanto ao
Vou ter que passar por um parametro no caso segueria assim ???
set term ^;
create procedure nome_proc
returns (cdtb integer, cdcd integer, cdds varchar(50)) as
begin
for select cdtb, cdcd, cdds from tabela order by cdtb, cdcd
into :cdtb, :cdcd, :cdds do
begin
if (not exists(select :PAR1 from tabela
where cdtb<:cdtb and cdcd=:cdcd) then
suspend;
end
end^
Pois eu terei que informar a tabela que irei pegar pode ser 100 tabelas e não só 1 ou duas mas pesquisa e somente para 2 tabelas variando apenas o nº delas
???
Gostei + 0
15/10/2004
Afarias
acho q essa seu modelo de dados não está muito de acordo com o ´modelo relacional´ visto q está precisando dessa consulta tão ´esquisita´ ... mas não posso ir mais ´a fundo´ visto q não conheço os detalhes.
|Vou ter que passar por um parametro no caso segueria assim ???
|if (not exists(select :PAR1 from tabela
vc não deve substituir o valor ´1´ por um parâmetro (PAR1) -- esse valor não quer dizer nada!! é só para usao da função exists!!
Esse procedimento deve retornar TODOS os registros da tabela TABELA ´não repetidos´
apenas faça :: ´SELECT * FROM NOME_PROC´
T+
Gostei + 0
18/10/2004
Sremulador
CREATE PROCEDURE PROCEDIMENTOVISUA (
TAB1 INTEGER,
TAB2 INTEGER)
RETURNS (
RPCTB INTEGER,
RPCCD INTEGER,
RPCDS VARCHAR (130),
RPCCX INTEGER,
RPACH DECIMAL (18, 4))
AS
BEGIN
FOR SELECT EPPV, EPPC, EPDS, EPCX, EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE
INTO RPCTB, RPCCD, RPCDS, RPCCX, RPACH DO
BEGIN
IF (NOT EXISTS(SELECT EPPV, EPPC FROM ESPECIFICA_PROCEDCONV_DETALHE
WHERE EPPV <:TAB1 AND EPPV=:TAB2)) THEN
SUSPEND;
END
END
Tenho que passar dois parametros que são as tabelas em que devo pesuisar, você tem ideia do acontecido ???
Gostei + 0
18/10/2004
Afarias
T+
Gostei + 0
18/10/2004
Sremulador
Mas tem que ter os parametros pois a pesquisa só será feita em duas EPPV se tiver repetido o EPPC ele retira e deixa somente um como o exemplo acima, não poderar ser feito em todas os valores da tabela...
Gostei + 0
18/10/2004
Sremulador
CREATE PROCEDURE PROCEDIMENTOVISUA (
TAB1 INTEGER,
TAB2 INTEGER)
RETURNS (
RPCTB INTEGER,
RPCCD INTEGER,
RPCDS VARCHAR (130),
RPCCX INTEGER,
RPACH DECIMAL (18, 4))
AS
BEGIN
FOR SELECT EPPV, EPPC, EPDS, EPCX, EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE
INTO RPCTB, RPCCD, RPCDS, RPCCX, RPACH DO
BEGIN
IF (NOT EXISTS(SELECT 1 FROM ESPECIFICA_PROCEDCONV_DETALHE
WHERE EPPV <: RPCTB AND EPPV=:RPCCD)) THEN
SUSPEND;
END
END
:(
Fiz assim tb e foi o que passou mais perto pos só me retornou os valores que eu queria...
CREATE PROCEDURE PROCEDIMENTOVISUA (
TAB1 INTEGER,
TAB2 INTEGER)
RETURNS (
RPCTB INTEGER,
RPCCD INTEGER,
RPCDS VARCHAR (130),
RPCCX INTEGER,
RPACH DECIMAL (18, 4))
AS
BEGIN
FOR SELECT EPPV, EPPC, EPDS, EPCX, EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE
WHERE EPPV IN (:TAB1, :TAB2)
INTO RPCTB, RPCCD, RPCDS, RPCCX, RPACH DO
BEGIN
IF (NOT EXISTS(SELECT 1 FROM ESPECIFICA_PROCEDCONV_DETALHE
WHERE EPPV <: RPCTB AND EPPV=:RPCCD)) THEN
SUSPEND;
END
END
O que você acha mestre....
Gostei + 0
18/10/2004
Sremulador
CREATE PROCEDURE PROCEDIMENTOVISUA (
TAB1 INTEGER,
TAB2 INTEGER)
RETURNS (
RPCTB INTEGER,
RPCCD INTEGER,
RPCDS VARCHAR (130),
RPCCX INTEGER,
RPACH DECIMAL (18, 4))
AS
BEGIN
FOR SELECT EPPV, EPPC, EPDS, EPCX, EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE
INTO RPCTB, RPCCD, RPCDS, RPCCX, RPACH DO
BEGIN
IF (NOT EXISTS(SELECT 1 FROM ESPECIFICA_PROCEDCONV_DETALHE
WHERE EPPV <: RPCTB AND [b:9c55dff1ed]EPPV=:RPCCD[/b:9c55dff1ed])) THEN
SUSPEND;
END
END
mas eu corregi logo em seguida com tudo deu certo não repetiu ai passei os parametros
CREATE PROCEDURE PROCEDIMENTOVISUA (
TAB1 INTEGER,
TAB2 INTEGER)
RETURNS (
RPCTB INTEGER,
RPCCD INTEGER,
RPCDS VARCHAR (130),
RPCCX INTEGER,
RPACH DECIMAL (18, 4))
AS
BEGIN
FOR SELECT EPPV, EPPC, EPDS, EPCX, EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE
WHERE EPPV IN [b:9c55dff1ed](:TAB1, :TAB2)[/b:9c55dff1ed] INTO RPCTB, RPCCD, RPCDS, RPCCX, RPACH DO
BEGIN
IF (NOT EXISTS(SELECT EPPC FROM ESPECIFICA_PROCEDCONV_DETALHE
WHERE EPPV <:RPCTB AND EPPC=:RPCCD)) THEN
SUSPEND;
END
END
mas ao retornar ele não na orde de passagem de parametro
por ex: par1=3
par2=1
então os primeiros com o EPPV com o valor 3 ele teria que me retornar e os com o valor 1 não me retornaria...
:idea:
Gostei + 0
18/10/2004
Afarias
CREATE PROCEDURE PROCEDIMENTOVISUA (TAB1 INTEGER, TAB2 INTEGER) RETURNS ( RPCTB INTEGER, RPCCD INTEGER, RPCDS VARCHAR (130), RPCCX INTEGER, RPACH DECIMAL (18, 4)) AS BEGIN FOR SELECT EPPV, EPPC, EPDS, EPCX, EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE WHERE EPPV = :TAB1 INTO :RPCTB, :RPCCD, :RPCDS, :RPCCX, :RPACH DO SUSPEND; FOR SELECT E.EPPV, E.EPPC, E.EPDS, E.EPCX, E.EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE E WHERE E.EPPV = :TAB2 AND NOT EXISTS ( SELECT 1 FROM ESPECIFICA_PROCEDCONV_DETALHE WHERE EPPV = :TAB1 AND EPPC=E.EPPC) INTO :RPCTB, :RPCCD, :RPCDS, :RPCCX, :RPACH DO SUSPEND; END^
ou ainda::
CREATE PROCEDURE PROCEDIMENTOVISUA (TAB1 INTEGER, TAB2 INTEGER) RETURNS ( RPCTB INTEGER, RPCCD INTEGER, RPCDS VARCHAR (130), RPCCX INTEGER, RPACH DECIMAL (18, 4)) AS BEGIN FOR SELECT E.EPPV, E.EPPC, E.EPDS, E.EPCX, E.EPCH FROM ESPECIFICA_PROCEDCONV_DETALHE E WHERE E.EPPV = :TAB1 OR (E.EPPV = :TAB2 AND NOT EXISTS ( SELECT 1 FROM ESPECIFICA_PROCEDCONV_DETALHE WHERE EPPV = :TAB1 AND EPPC=E.EPPC)) INTO :RPCTB, :RPCCD, :RPCDS, :RPCCX, :RPACH DO SUSPEND; END^
T+
Gostei + 0
20/10/2004
Sremulador
Select [b:7d7cddb2e3]1[/b:7d7cddb2e3] ???? pois eu não entendi...
Valeu brigadão mesmo
Gostei + 0
20/10/2004
Afarias
|Select 1 ???? pois eu não entendi...
quando vc usa um SELECT dentro de uma função EXISTS os valores trazidos pelo select não tem qualquer função/importancia -- Mas o SELECT exige q vc defina alguma coisa, por isso o 1 -- apenas para estar conforme a sintaxe do SELECT.
No lugar do 1 pode ser qualquer coisa, só não coloque por exemplo *, ou vários campos, pq vc vai estar acrecentando uma série de ´processamento´ desnecesário.
vc tb podia colocar, por exemplo::
select null from ..
select 0 from ...
select ´OK´ from ...
select ´S´ from ...
dá no mesmo! dai, particularmente eu uso o 1 :D
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)