Utilizando o distinct para um campo
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 ...
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
Curtidas 0
Respostas
Afarias
13/10/2004
mas não tem como funcionar!! como o baco iria saber quais os registros trazer??
T+
T+
GOSTEI 0
Sremulador
13/10/2004
teria outra maneira de se chegar a este resultado ???
GOSTEI 0
Afarias
13/10/2004
bom, com um SP vc pode fazer praticamente tudo. Mostre um exemplo ai de que resultado vc pretende para ser analisado.
T+
T+
GOSTEI 0
Sremulador
13/10/2004
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
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
Afarias
13/10/2004
Acho q essa é uma forma::
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+
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
Sremulador
13/10/2004
Certo mestre
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
???
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
???
GOSTEI 0
Afarias
13/10/2004
|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+
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
Sremulador
13/10/2004
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 ???
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
Afarias
13/10/2004
vc já tentou fazer *exatamente* da forma q eu sugeri (sem parâmetros de entrada) ??
T+
T+
GOSTEI 0
Sremulador
13/10/2004
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...
GOSTEI 0
Sremulador
13/10/2004
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....
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
Sremulador
13/10/2004
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:
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
Afarias
13/10/2004
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::
ou ainda::
T+
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
Sremulador
13/10/2004
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
Select [b:7d7cddb2e3]1[/b:7d7cddb2e3] ???? pois eu não entendi...
Valeu brigadão mesmo
GOSTEI 0
Afarias
13/10/2004
|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+
|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