Oracle关联子查询
在本教程中,您将学习Oracle关联子查询,这是一个子查询,其子句引用了外部查询中的列表达式。
Oracle关联子查询简介
请参阅中的以下产品(products)表:
以下使用子句中的从产品(products)表中返回最便宜的产品。
SELECT product_id, product_name, list_price FROM products WHERE list_price =( SELECT MIN( list_price ) FROM products );
执行上面查询语句,得到以下结果 -
下面来更详细地解释这个查询语句。
首先,我们可以独立执行子查询。如 -
SELECT MIN( list_price ) FROM products;
其次,Oracle只评估(计算)一次子查询。
第三,子查询返回一个结果集后,外部查询使用它们。换句话说,外部查询取决于子查询。 但是,子查询是孤立的,不依赖于外部查询的值。
与上面的子查询不同,关联子查询是使用来自外部查询的值的。另外,对于由外部查询选择的每一行,关联子查询要评估计算一次。 因此,使用相关子查询的查询可能会很慢。
关联子查询也称为重复子查询或同步子查询。
Oracle关联子查询示例
我们来看一些关联子查询的例子,以更好地理解它们。
1. Oracle WHERE子句中的关联子查询示例
以下查询查找标价高于其平均标价的所有产品。
SELECT product_id, product_name, list_price FROM products p WHERE list_price > ( SELECT AVG( list_price ) FROM products WHERE category_id = p.category_id );
执行上面查询语句,得到以下结果 -
在上面的查询中,外部查询是:
SELECT product_id, product_name, list_price FROM products p WHERE list_price >
关联的子查询是:
SELECT AVG( list_price ) FROM products WHERE category_id = p.category_id
对于products表中的每个产品,Oracle必须执行关联子查询以按类别计算平均标价。
2. Oracle在SELECT子句中关联子查询示例
以下查询返回基于产品类别的所有产品和标准成本:
SELECT product_id, product_name, standard_cost, ROUND( ( SELECT AVG( standard_cost ) FROM products WHERE category_id = p.category_id ), 2 ) avg_standard_cost FROM products p ORDER BY product_name;
执行上面查询语句,得到以下结果 -