0

我有两个表,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))

这似乎是一种非常低效的查询编码方式,有没有更好的方法来编写这个?

4

1 回答 1

5

这取决于表的索引方式。这取决于您使用的是什么 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关键字来缓解这种情况。应该注意的是,连接不一定比其他技术更有效。特别是,如果您必须使用distinctas 这需要额外的工作来确保独特性。

于 2013-09-04T18:48:15.503 回答