18

我有两张桌子,A,B

A: id is primary key and indexed

id,  type_id,  status
------------------
1,  1,  True
2,  1,  False
3,  2,  False
...

B: (Type) type_id is primary key and indexed

type_id, param
----------
1,  23
2,  35
3,  24

我想选择B其中至少有 1 个关联条目的所有Astatus True

select distinct B.id, B.param 
from B
join A on A.type_id = B.type_id
where A.status = true

这是一个好方法吗?

4

2 回答 2

19

我会这样做(在大多数数据库系统中应该是有效的:

select *
from b
where type_id in (
  select type_id
  from a
  where status = true
)

对于你的问题,如果你的方法是一个好方法,我的回答是否定的,这不是一个好方法,因为它可能会强制一个大的中间记录集(通过加入)然后在中间记录集上花费时间。

更新

经过一番思考,我意识到没有绝对的好或坏的解决方案。这一切都取决于您在每个表中拥有的数据(总记录、价值分布等......)。因此,请继续使用清楚传达意图的方法,并准备好在生产中遇到性能问题时尝试不同的方法。

于 2013-10-03T15:34:46.497 回答
3
SELECT B.*
FROM B
WHERE B.type_id
IN 
( SELECT A.type_id 
  FROM A WHERE status='True'
);
于 2013-10-03T15:34:43.243 回答