2010-06-09 69 views
4

我已经写了相同的查询作为子查询和自连接。哪些查询更可取?

在这里有一个比另一个有任何明显的争论?

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’; 
+0

那么,对于初学者来说,如果给定产品有多个vend_id,他们会返回不同的结果,我想。我想你可能打算在子查询中使用“IN”,而不是“=”。不过,我可能是错的,我只是刚刚喝上一杯咖啡。 – 2010-06-09 08:39:48

+0

请添加(作为标签)您的数据库引擎。编写查询的最佳方式可能取决于数据库引擎。 – 2010-06-09 08:47:53

回答

2

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

第一个查询显示该批次而第二个显示50.8%的49.2%,领先 一个想到的是,子查询是稍快。

现在,我启动了Profiler并运行了两个查询。第一个查询需要 超过92,000个读取执行,但加入的只需要2300, 使我相信内部连接速度要快得多。

有冲突的反应,但:

我的经验法则:只使用,如果你需要输出从 表你join'ing一列JOIN的;否则,使用子查询。

这:

加盟应该总是快 - 理论上和现实。子查询 - 特别相关 - 可能非常难以优化。如果你认为 关于它,你会看到为什么 - 从技术上讲,子查询可以为外部查询的每一行执行一次 - blech!

我也同意Madhivanan,如果子查询返回的任何东西,但一个值你的主要查询将失败,所以使用IN来代替。

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’; 
0

如果您不需要任何列从连接表,然后使用子查询通常是优选的,虽然这是依赖于RDBMS类型。应使用IN子句代替:

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