哪个查询更可取?

时间:2010-06-09 08:36:50

标签: sql

我编写了与子查询和自联接相同的查询。

这里有一个明显的争论吗?

SUBQUERY:

SELECT prod_id, prod_name
FROM products
WHERE vend_id = (SELECT vend_id
FROM products
WHERE prod_id = ‘DTNTR’);

自连接:

SELECT p1.prod_id, p1.prod_name
FROM products p1, products p2
WHERE p1.vend_id = p2.vend_id
AND p2.prod_id = ‘DTNTR’;

3 个答案:

答案 0 :(得分:3)

如果子查询返回的值超过值

,则第一个查询可能会抛出错误

第二个查询不符合ANSI

因此最好使用ANSI样式连接

SELECT p1.prod_id, p1.prod_name 
FROM products as p1 inner join products as p2 
on p1.vend_id = p2.vend_id 
WHERE p2.prod_id = ‘DTNTR’; 

答案 1 :(得分:2)

This post有一些关于执行时间的数字。海报说:

  

第一个查询显示批次的49.2%,而第二个查询显示50.8%,领先   一个认为子查询稍快一点。

     

现在,我启动了Profiler并运行了两个查询。第一个查询需要   要执行的读取超过92,000个,但加入的读取只需要2300个,   让我相信内连接明显更快。

虽然存在相互矛盾的回应:

  

我的经验法则:如果你需要从中输出一列,只使用JOIN   你加入的桌子;否则,使用子查询。

和此:

  

加入应始终更快 - 理论上和现实上。子查询    - 特别相关 - 可能很难优化。如果你认为   关于它你会明白为什么 - 从技术上讲,子查询可以执行一次   对于外部查询的每一行 - blech!

我也同意Madhivanan,如果子查询只返回一个值,那么主查询将失败,所以请改用IN

答案 2 :(得分:0)

如果您不需要JOINed表中的任何列,那么通常首选使用子选择,尽管这取决于RDBM类型。应该使用IN子句:

SELECT prod_id, prod_name
FROM products
WHERE vend_id IN (SELECT vend_id
   FROM products
   WHERE prod_id = ‘DTNTR’);