我有两个表,Table1 和 Table2,我试图根据 Table2 中的值从 Table1 中选择值。我目前正在编写如下查询:
SELECT Value From Table1
WHERE
(Key1 in
(SELECT KEY1 FROM Table2 WHERE Foo = Bar))
AND
(Key2 in
(SELECT KEY2 FROM Table2 WHERE Foo = Bar))
这似乎是一种非常低效的查询编码方式,有没有更好的方法来编写这个?
我有两个表,Table1 和 Table2,我试图根据 Table2 中的值从 Table1 中选择值。我目前正在编写如下查询:
SELECT Value From Table1
WHERE
(Key1 in
(SELECT KEY1 FROM Table2 WHERE Foo = Bar))
AND
(Key2 in
(SELECT KEY2 FROM Table2 WHERE Foo = Bar))
这似乎是一种非常低效的查询编码方式,有没有更好的方法来编写这个?
这取决于表的索引方式。这取决于您使用的是什么 SQL 实现(SQL Server?MySq1?Oracle?MS Access?还有什么?)。它还取决于表大小(如果表很小,表扫描可能比更高级的东西更快)。索引是否覆盖索引也很重要(这意味着测试可以满足索引本身的数据,而不是需要额外的后备来获取相应的数据页面。)除非您查看执行计划,你不能真的说技术 X 比技术 Y“更好”。
但是,一般而言,对于这种情况,您最好使用相关子查询,因此:
select *
from table1 t1
where exists( select *
from table2 t2
where t2.key1 = t1.key1
)
and exists( select *
from table2 t2
where t2.key2 = t1.key2
)
加入也是一种可能:
select t1.*
from table1 t1
join table2 t2a = t2a.key1 = t1.key1 ...
join table2 t2b = t2b.key2 = t1.key2 ...
尽管这将为每个匹配组合提供 1 行,但可以通过使用distinct
关键字来缓解这种情况。应该注意的是,连接不一定比其他技术更有效。特别是,如果您必须使用distinct
as 这需要额外的工作来确保独特性。