Как я могу улучшить этот запрос SQL? - PullRequest
1 голос
/ 29 октября 2008

Я проверяю наличие строки в in_fmd, и ISBN, который я ищу, может быть параметром ISBN или другим ISBN в таблице перекрестных номеров, которая может иметь или не иметь строку.

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
    )
) 

На самом деле меня не интересует количество строк, а просто наличие хотя бы одной строки.

Раньше это были три отдельных запроса, и я разбил их на один, но я думаю, что есть место для большего улучшения. Это PostgreSQL 8.1, если это имеет значение.

Ответы [ 5 ]

4 голосов
/ 29 октября 2008

Зачем беспокоиться с 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)
    )

Я бы, вероятно, использовал бы LEFT JOIN стиль запроса вместо IN, но это более личное предпочтение:

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)
    )

Обращение обсуждалось по 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
1 голос
/ 30 января 2009

кроме того, что отмечали другие постеры, просто меняется

выберите количество (*)

до

существует (..)

улучшит немного

1 голос
/ 30 января 2009
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
1 голос
/ 29 октября 2008

На самом деле меня не интересует количество строк, а просто наличие хотя бы одной строки.

Тогда как насчет запроса SELECT ... LIMIT 1 и проверки в вызывающей программе, получаете ли вы одну строку результатов или нет?

0 голосов
/ 29 октября 2008
select count(*)
from in_fmd i
where description = 'GN'
  and exists (select 1 
              from bwi_isbn 
              where bw_isbn.bwi_isbn = in_fmd.isbn)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...