SQL中最有效的书面查询

时间:2013-09-04 18:39:38

标签: sql

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

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

1 个答案:

答案 0 :(得分: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关键字来缓解这一行。应该注意,连接不一定比其他技术更有效。特别是,如果您必须使用distinct,因为这需要额外的工作以确保清晰度。