我编写了与子查询和自联接相同的查询。
这里有一个明显的争论吗?
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 :(得分: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’);