[英]How can I improve this SQL query?
我正在检查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。
为什么要为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
我实际上并不在乎行数,而仅仅是至少存在一行。
那么,如何查询SELECT ... LIMIT 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
select count(*)
from in_fmd i
where description = 'GN'
and exists (select 1
from bwi_isbn
where bw_isbn.bwi_isbn = in_fmd.isbn)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.