将嵌套查询转换为连接
convert nested query to join
我有两个表:
entry
id
......
individual
id,
entry_id,
code
其中 entry
与 individual
具有一对多关系。
我想 select 属于一个条目的所有个人,该条目包含超过 3 个代码在 A=10 和 B=15 之间的个人
我写了这个查询并且有效:
select entry_id,id
from individual as i
where i.entry_id in
(select entry_id
from individual as v
where v.code between 10 and 15
group by entry_id
having count(*) > 3 )
但是速度很慢。
所以我想尝试将其转换为使用连接而不是嵌套查询。
这是一个连接版本,但我不确定它是否会比您的嵌套查询解决方案更快。
select i1.entry_id, i1.id
from individuals as i1
join individuals as i2
on (i1.entry_id = i2.entry_id)
where i2.vcode between 10 and 15
group by i1.entry_id, i1.id
having count(*) > 3;
请注意,如果 id
或 (id, entry_id
) 是 table individuals
的 primary/unique 键,则此查询仅等同于您的查询。
select
entry_id,
id,
code
from
individuals as i1
where
vcode between 10 and 15
And entry_id in (
select entry_id from individuals group by entry_id having count(entry_id) > 3
)
仅当您需要显示条目 table
的值时才加入条目 table
我有两个表:
entry
id
......
individual
id,
entry_id,
code
其中 entry
与 individual
具有一对多关系。
我想 select 属于一个条目的所有个人,该条目包含超过 3 个代码在 A=10 和 B=15 之间的个人
我写了这个查询并且有效:
select entry_id,id
from individual as i
where i.entry_id in
(select entry_id
from individual as v
where v.code between 10 and 15
group by entry_id
having count(*) > 3 )
但是速度很慢。
所以我想尝试将其转换为使用连接而不是嵌套查询。
这是一个连接版本,但我不确定它是否会比您的嵌套查询解决方案更快。
select i1.entry_id, i1.id
from individuals as i1
join individuals as i2
on (i1.entry_id = i2.entry_id)
where i2.vcode between 10 and 15
group by i1.entry_id, i1.id
having count(*) > 3;
请注意,如果 id
或 (id, entry_id
) 是 table individuals
的 primary/unique 键,则此查询仅等同于您的查询。
select
entry_id,
id,
code
from
individuals as i1
where
vcode between 10 and 15
And entry_id in (
select entry_id from individuals group by entry_id having count(entry_id) > 3
)
仅当您需要显示条目 table
的值时才加入条目 table