Select 1 from...

Dúvidas, dicas e truques de SQL, Select, Update, Delete, cláusulas, operações com joins, Funções em SQLs, etc
clfort09
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qua, 09 Dez 2009 9:56 am
Localização: Fortaleza - CE
Carlos Francisco

Bom dia,

Estou com uma dúvida no SQL agradeço se alguém puder ajudar.

Estou estudando algumas querys sql e vi que em alguns locais tem

SELECT 1 FROM .... (Dentro de uma sub-query)

O que seria isso?


Obrigado desde já.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Cara geralmente select 1 from.. é pra testar se existe alguma coisa na tabela conforme os parâmetros da query.

Mas só da pra confirmar o porque ele foi usado se tu postar uma query exemplo.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

é simples como o sergio falou..

considere como uma verificaçao de existencia.. se existe então...
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
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

Quase sempre o SELECT 1 vem logo após um EXISTS.
Pois o Exists retorna VERDADEIRO caso tenha alguma coisa. E falso se não vier nada.
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Em geral é isso mesmo.

O exemplo mais complexo de entender em um select 1 from é em um report que eu trabalhei onde conforme os parâmetros informados ele adicionava na query do report algo tipo

Selecionar tudo

AND 1 = (select 1 from tabela where ....)
até hoje eu não entendo como a query retornava valores quando o resultado do select 1 era nulo, só sei que funcionava direitinho e que foi desenvolvido desta maneira para melhorar a performance.
clfort09
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 6
Registrado em: Qua, 09 Dez 2009 9:56 am
Localização: Fortaleza - CE
Carlos Francisco

obrigado a todos pela explicação. Agora entendi. :)
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Quanto a melhorar a performance eu diria que é mito. Mas funcionou está certo.
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

pode se dizer ate que é desprezivel porem tem um tempo na query destino para montagem da saída, logo poderia interferir sim.. mas como disse talvez a interferencia seja desprezivel
SergioLBJr
Rank: Oracle Guru
Rank: Oracle Guru
Mensagens: 448
Registrado em: Ter, 16 Jun 2009 3:07 pm
Localização: Parobé - RS
Sérgio Luiz Bonemberger Junior
Programador Junior
Parobé RS

[]s

Bom , se realmente melhora a performance da query eu não posso afirmar que sim, pois nunca cheguei a alterar a query para fazer a restrição dos parâmetros de maneira "normal".

Mas é certo que algum motivo para estruturar todo o relatório de maneira diferente dos demais existe, só que como ele foi desenvolvido por pessoas que não mais trabalham na empresa.

Se você souberem alguma diferença

O que é feito é algo assim, eu tenho uma consulta baseado em varias tabelas, os joins entre elas são feito pelas pk's, até aí normal.

Porém ao invés de restringir os campos tipo :

Selecionar tudo

tabela.campo = nvl(:parametro, tabela.campo)
ou....

Selecionar tudo

(:parametro is null or (tabela.campo = :parametro))
como é feito na grande maioria dos relatórios, as restrições são feitas na trigger after parameter form e adicionadas na query como um &parametro.

E são algo tipo :

Selecionar tudo

 (AND 1 = (select 1 from tabela where (algumas restrições que poderiam estar na query) and campo = nvl(:parametro, campo)))
Eu imaginava que ele foi desenvolvido para poder fazer restrições que afetem apenas o resultado do parâmetro e não toda a query do report em si, mas depois me disseram que não.

Se alguém souber por favor posta aí.
Avatar do usuário
fsitja
Rank: OraSauro
Rank: OraSauro
Mensagens: 611
Registrado em: Seg, 19 Jan 2009 4:29 pm
Localização: Gaúcho no Rio de Janeiro - RJ
"The scars exist to remind us that the past was real"
Campanha: Como fazer uma pergunta e obter uma resposta.
http://tkyte.blogspot.com/2005/06/how-t ... tions.html

OCA & OCP Developer — OCE SQL Expert — OCS Data Warehousing Specialist

Sem ver um explain plan e um tkprof é difícil de dizer o motivo. Assumindo que as duas queries retornem o mesmo output, mas essa versão é mais rápida, é provável que essa mudança tenha "passado a perna" no CBO, fazendo ele avaliar num plano de acesso com custo menor e coincidentemente com um desempenho superior, com menos consistent gets ou técnicas de join mais adequadas ao que está sendo recuperado.

Não quero dizer que não ficou mais rápido nesse caso, até porque contra fatos não há argumentos, mas sim que esse tipo de solução não é um "macete" secreto do Oracle e que vai implicar numa melhoria de desempenho em outros casos.
Responder
  • Informação
  • Quem está online

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