GARANTIR DESCONTO

Fórum Utilizando o distinct para um campo #47426

13/10/2004

0

eu contaria de fazer um select da seguinte maneira

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

Sremulador

Responder

Posts

13/10/2004

Afarias

mas não tem como funcionar!! como o baco iria saber quais os registros trazer??


T+


Responder

Gostei + 0

14/10/2004

Sremulador

teria outra maneira de se chegar a este resultado ???


Responder

Gostei + 0

14/10/2004

Afarias

bom, com um SP vc pode fazer praticamente tudo. Mostre um exemplo ai de que resultado vc pretende para ser analisado.



T+


Responder

Gostei + 0

14/10/2004

Sremulador

Bem mestre vamos lá, bem o que acontece e o seguinte eu tenho varias tabelas de cadastro de serviços, porem tem uma mestra que contém todos e outras auxiliares que caso haja um valor modificado a minha lista tem que conter a da tabela auxiliar

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


Responder

Gostei + 0

15/10/2004

Afarias

Acho q essa é uma forma::

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+


Responder

Gostei + 0

15/10/2004

Sremulador

Certo mestre

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


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

???


Responder

Gostei + 0

15/10/2004

Afarias

|O que seria esta revisão em que parte ?

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+


Responder

Gostei + 0

18/10/2004

Sremulador

Mestre não consegui fazer com que a procedure me retornase somente os distintos fiz da seguinte maneira

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 ???


Responder

Gostei + 0

18/10/2004

Afarias

vc já tentou fazer *exatamente* da forma q eu sugeri (sem parâmetros de entrada) ??



T+


Responder

Gostei + 0

18/10/2004

Sremulador

vc já tentou fazer *exatamente* da forma q eu sugeri (sem parâmetros de entrada) ??


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...


Responder

Gostei + 0

18/10/2004

Sremulador

Fiz da maneira que você passou mas não deu, continua repetindo

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....


Responder

Gostei + 0

18/10/2004

Sremulador

mestre dei uma mancada

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:


Responder

Gostei + 0

18/10/2004

Afarias

tudo bem, achei q sempre era em relação a todas as tabelas, como é sempre em relação a dois valores apenas (e a ordem deles importa) então tente assim::

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+


Responder

Gostei + 0

20/10/2004

Sremulador

Mestre você e demais, funcionou direitinho com a 1º opção mas me explique uma coisa pra que que serve este

Select [b:7d7cddb2e3]1[/b:7d7cddb2e3] ???? pois eu não entendi...

Valeu brigadão mesmo


Responder

Gostei + 0

20/10/2004

Afarias

|mas me explique uma coisa pra que que serve este
|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+


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar