Oracle中關聯子查詢
求價格高於同類產品平均價格的產品
方法一:
分析:每一類產品的平均價格如下:
select product_type_id,avg(price) from products
group by product_type_id;
PRODUCT_TYPE_ID AVG(PRICE)
--------------- ----------
1 24.975
2 26.22
3 13.24
4 13.99
13.49
如果把上面的結果保存爲一個表,如 products_avg,
create table
products_avg
as
select product_type_id,avg(price) avg_price from products
group by product_type_id
求價格高於同類產品平均價格的產品,就可以通過prodducts與products_avg進行關聯查詢:
select product_id,p.product_type_id,p.name,p.price
from products p
join
products_avg a
on
p.product_type_id=a.product_type_id
where p.price>a.avg_price;
PRODUCT_ID PRODUCT_TYPE_ID NAME PRICE
---------- --------------- ------------------------------ ----------
2 1 Chemistry 30
5 2 Z Files 49.99
7 3 Space Force 9 13.49
10 4 Pop 3 15.99
11 4 Creative Yell 14.99
上面的結果正對,即查詢到每種產品,看其價格都大於同類產品的平均價格.
方法二:
還可以使用關聯子查詢實現上面要求. 關聯子查詢會引用外部查詢中的一列或多列.在執行時,外部查詢的每一行都被一次一行地傳遞給子查詢.子查詢依次讀取外部查詢傳遞來的每一值,並將其用到子查詢上,直到外部查詢所有的行都處理完爲止.然後返回查詢結果.
本例中,外部查詢從products表中檢索出所有的行,並將其傳遞給內部查詢.內部查詢依次讀取外部查詢傳遞來的每一行數據,並對內部查詢中product_type_id等於外部查詢的中product_type_id值的每種產品計算平均價格.
如:查詢第一行product_type_id爲1時,把這行數據傳遞到內部查詢,內部查詢根據這個編號到產品表中找到同類型的所有行,然後求如平均價格,外部查詢再根據這個結果來判斷查詢條件(外部查詢是在執行者where語句時用到子查詢,子查詢執行完後還返回到where子句中).
select product_id,product_type_id,name,price
from products outer
where
price>(
select avg(price)
from products inner
where
inner.product_type_id=outer.product_type_id)
PRODUCT_ID PRODUCT_TYPE_ID NAME PRICE
---------- --------------- ------------------------------ ----------
2 1 Chemistry 30
5 2 Z Files 49.99
7 3 Space Force 9 13.49
10 4 Pop 3 15.99
11 4 Creative Yell 14.99
例2 : 顯示曾經有過兩次工作以上的員工.
SELECT e.employee_id, last_name,e.job_id FROM employees e WHERE 2 <= (SELECT COUNT(*) FROM job_history WHERE employee_id = e.employee_id);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.