Aprenda PL/SQL

QUERY RETORNAR DADOS NO EXISTS

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
  

Mensagemem Sex, 18 Dez 2015 6:13 pm

Boa tarde.

Gostaria da ajuda de vocês na query abaixo:

Código: Selecionar todos
SELECT C.*
        FROM TB_CENTRAL C
       WHERE EXISTS (SELECT DISTINCT 1
                                FROM TB_INTERMEDIARIA I
                              WHERE I.ID_ETA IN (16,24)
                                   AND I.ID = C.ID)

Existe alguma forma ou função que so retorno os dados caso os dois registros do in (16 e 24) existirem na tabela tb_intermediaria. Porque nesse caso se eu informar somente o 16 os dados já são retornados.
Exemplo:

Código: Selecionar todos
SELECT C.*
        FROM TB_CENTRAL C
       WHERE EXISTS (SELECT DISTINCT 1
                                FROM TB_INTERMEDIARIA I
                              WHERE I.ID_ETA IN (16)
                                   AND I.ID = C.ID)


O que preciso é somente retornar dados se os dois registros realmente existirem na tabela....
Moloukos
Localização: São Paulo - SP

Moloukos Rox

Mensagemem Sex, 18 Dez 2015 10:13 pm

Precisa necessariamente usar o IN ?
tiago_pimenta
Localização: Barretos / SP

Mensagemem Seg, 21 Dez 2015 7:41 am

Moloukos,

Você poderia fazer uma querie parecida com esta:

Código: Selecionar todos
SELECT C.*
  FROM TB_CENTRAL C
WHERE EXISTS (SELECT 1
                 FROM TB_INTERMEDIARIA I
                WHERE I.ID_ETA =  16
                  AND I.ID = C.ID)
   AND EXISTS (SELECT 1
                 FROM TB_INTERMEDIARIA I
                WHERE I.ID_ETA =  24
                  AND I.ID = C.ID)


Abraços,

Sergio
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Seg, 21 Dez 2015 9:33 am

Tiago,

Não preciso necessariamente usar o in, mas preciso saber se os valores passados estão exatamente iguais aos cadastrados no banco.

Recebo uma string com os valores 12, 5 , 33 --- Esses valores podem ser alterados em cada query.
Na próxima posso receber 5, 33

E tenho que ir na tabela e validar se esta exatamente igual ao cadastrado.
As linhas na tabela estão assim para o registro 1 :
TB_INTERMEDIARIA id = 1 , ID_ETA = 5
TB_INTERMEDIARIA id = 1 , ID_ETA = 33
Moloukos
Localização: São Paulo - SP

Moloukos Rox

Mensagemem Seg, 21 Dez 2015 9:36 am

Sérgio,

Dessa maneira eu tenho um problema porque a string que recebo é dinâmica.

Posso receber na primeira chamada 12, 5, 33
Na segunda chamada 5, 33

Ai teria que montar dinamicamente a quantidade de exists da maneira que você passou para montar a query.
Moloukos
Localização: São Paulo - SP

Moloukos Rox

Mensagemem Qua, 20 Jan 2016 12:27 pm

É, acho que se sua string é dinâmica, o melhor a fazer é uma cláusula WHERE dinâmica. Mas de preferência, usando BINDS no sql dinâmico.
dr_gori
Localização: Porto Alegre - RS

Thomas F. G
https://www.patreon.com/glufke

Mensagemem Qui, 21 Jan 2016 10:01 am

Moloukos,

Só lembrando que dentro de um "IN" você só pode "aninhar" até 1000 elementos. Se forem mais de 1.000 você vai ter que colocar as listas em vários comandos IN, cada um deles contendo até 1.000 elementos.

Abraços,

Sergio
stcoutinho
Localização: Sao Paulo - SP

Mensagemem Qui, 18 Fev 2016 8:33 am

Bom dia amigos.

Caro Moloukos,

Se você ainda estiver precisando de ajuda (apesar do tempo), a resposta é SIM.

Sua situação pode ser resolvida facilmente utilizando a cláusula "=ALL".

Exemplo:

Código: Selecionar todos
select *
     from tabela
   where campo   =ALL  (1,2,3,4)


Neste caso, a consulta resultará dados apenas se todos valores da lista (1,2,3,4) estiverem no campo.

Além do ALL, existem outras condições de comparações, como o ANY e SOME.

Abraço.
Júlio César
juliocpgr

Mensagemem Sex, 01 Abr 2016 6:13 pm

Júlio, obrigado pelo retorno.

Vou utilizar nas próximas implementações.
Moloukos
Localização: São Paulo - SP

Moloukos Rox



Voltar para SQL

Quem está online

Usuários navegando neste fórum: Nenhum usuário registrado e 5 visitantes