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
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Boa tarde.

Gostaria da ajuda de vocês na query abaixo:

Selecionar tudo

 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:

Selecionar tudo

 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....
Avatar do usuário
tiago_pimenta
Rank: DBA Júnior
Rank: DBA Júnior
Mensagens: 213
Registrado em: Qua, 29 Jun 2011 9:49 am
Localização: Barretos / SP

Precisa necessariamente usar o IN ?
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

Moloukos,

Você poderia fazer uma querie parecida com esta:

Selecionar tudo

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
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

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 :

Selecionar tudo

TB_INTERMEDIARIA id = 1 , ID_ETA = 5
TB_INTERMEDIARIA id = 1 , ID_ETA = 33
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

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.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5023
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

É, 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.
Avatar do usuário
stcoutinho
Moderador
Moderador
Mensagens: 850
Registrado em: Qua, 11 Mai 2011 5:15 pm
Localização: são Paulo - SP

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
juliocpgr
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 1
Registrado em: Qui, 13 Ago 2015 5:23 pm

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:

Selecionar tudo

 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
Moloukos
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 54
Registrado em: Qui, 18 Set 2008 10:22 pm
Localização: São Paulo - SP
Moloukos Rox

Júlio, obrigado pelo retorno.

Vou utilizar nas próximas implementações.
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante