Sql 以下哪项查询更可取?

Sql 以下哪项查询更可取?,sql,Sql,我编写了与子查询和自连接相同的查询 这里有什么明显的论据支持一种观点而不是另一种观点吗 子查询: 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

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

这里有什么明显的论据支持一种观点而不是另一种观点吗

子查询:

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’;
自加入:

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

如果子查询返回的值多于一个,则第一个查询可能会抛出错误

第二个查询不符合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’; 

如果不需要联接表中的任何列,则通常最好使用subselect,尽管这取决于RDBMs类型。应改用IN子句:

SELECT prod_id, prod_name
FROM products
WHERE vend_id IN (SELECT vend_id
   FROM products
   WHERE prod_id = ‘DTNTR’);
有一些执行时间的数字。海报上说:

第一个查询显示该批次的49.2%,第二个查询显示50.8%,领先 有人认为子查询稍微快一点

现在,我启动了探查器并运行了这两个查询。第一个查询是必需的 要执行的读取超过92000次,但具有联接的仅需要2300次, 这让我相信内部连接的速度要快得多

不过,有一些相互矛盾的回应:

我的经验法则:仅当需要从 您要加入的表;否则,请使用子查询

这是:

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


我也同意Madhivanan的观点,如果子查询只返回一个值,那么您的主查询将失败,因此请改用中的。

首先,我认为,如果给定产品有多个供应商id,它们将返回不同的结果。我猜您可能想在子查询中使用“IN”,而不是“=”。不过,我可能错了,我刚刚喝了一天中的第一杯咖啡。请添加(作为标记)您的数据库引擎。编写查询的最佳方式可能取决于db引擎。