Como posso melhorar esta consulta SQL?

votos
1

Estou verificando existente de uma linha em in_fmd, eo ISBN Eu olho para cima pode ser o parâmetro ISBN ou outro ISBN em uma tabela cruzada número que pode ou não ter uma linha.

select count(*)
from in_fmd i
where (description='GN')
    and ( i.isbn in
    (
        select bwi_isbn from bw_isbn where orig_isbn = ?
        union all
        select cast(? as varchar) as isbn
    )
) 

Eu realmente não se preocupam com a contagem das linhas, mas sim mera existência de pelo menos uma linha.

Isto costumava ser três consultas separadas, e eu esmagado-lo em um, mas eu acho que há espaço para mais melhorias. É PostgreSQL 8.1, se isso importa.

Publicado 29/10/2008 em 20:13
fonte usuário
Em outras línguas...                            


5 respostas

votos
4

Por que se preocupar com o UNION ALL

select count(*)
from in_fmd i
where (description='GN')
    and (
        i.isbn in (
            select bwi_isbn from bw_isbn where orig_isbn = ?
        )
        or i.isbn = cast(? as varchar)
    )

Eu provavelmente iria usar uma LEFT JOINconsulta de estilo em vez do IN, mas isso é mais preferência pessoal:

select count(*)
from in_fmd i
left join bw_isbn
    on bw_isbn.bwi_isbn = i.isbn
    and bw_isbn.orig_isbn = ?
where (i.description='GN')
    and (
        bw_isbn.bwi_isbn is not null
        or i.isbn = cast(? as varchar)
    )

A inversão discutido sobre IM:

SELECT SUM(ct)
FROM (
    select count(*) as ct
    from in_fmd i
    inner join bw_isbn
        on bw_isbn.bwi_isbn = i.isbn
        and bw_isbn.orig_isbn = ?
        and i.isbn <> cast(? as varchar)
        and i.description = 'GN'

    UNION

    select count(*) as ct
    from in_fmd i
    where i.isbn = cast(? as varchar)
        and i.description = 'GN'
) AS x
Respondeu 29/10/2008 em 20:19
fonte usuário

votos
0
select count(*)
from in_fmd i
where description = 'GN'
  and exists (select 1 
              from bwi_isbn 
              where bw_isbn.bwi_isbn = in_fmd.isbn)
Respondeu 29/10/2008 em 20:20
fonte usuário

votos
1

Eu realmente não se preocupam com a contagem das linhas, mas sim mera existência de pelo menos uma linha.

Então, como sobre como consultar SELECT ... LIMIT 1e verificar no programa de chamada se você receber uma linha do resultado ou não?

Respondeu 29/10/2008 em 20:20
fonte usuário

votos
1
SELECT SUM(ct)
FROM (select count(*) as ct
      from in_fmd i
      inner join bw_isbn
         on bw_isbn.bwi_isbn = i.isbn
        and bw_isbn.orig_isbn = ?
        and i.isbn <> cast(? as varchar)
        and i.description = 'GN'
      UNION
      select count(*) as ct
      from in_fmd i
      where i.isbn = cast(? as varchar)
        and i.description = 'GN'
     ) AS x
Respondeu 30/01/2009 em 07:03
fonte usuário

votos
1

além do que outras pôsteres, apenas mudando

select count (*)

para

existe(..)

iria melhorar as coisas um pouco

Respondeu 30/01/2009 em 07:13
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more