Sử dụng các truy vấn phụ trong mệnh đề FROM
Doanh thu sản phẩm tại San Jose trong tháng Giêng 2004 so với doanh thu sản phẩm này hàng năm trong cùng thành phố trong cùng năm là như thế nào?
SELECT sales1.product, jan_04_sales, total_04_sales FROM (SELECT prod_name, SUM(dollars) FROM aroma.product a, aroma.sales b, aroma.period c, aroma.store d WHERE a.prodkey = b.prodkey AND a.classkey = b.classkey AND c.perkey = b.perkey AND d.storekey = b.storekey AND c.year = 2004 AND c.month = 'JAN' AND d.city LIKE 'San J%' GROUP BY a.prod_name) AS sales1(product, jan_04_sales) , (SELECT prod_name, SUM(dollars) AS total_04_sales FROM aroma.product a, aroma.sales b, aroma.period c, aroma.store d WHERE a.prodkey = b.prodkey AND a.classkey = b.classkey AND c.perkey = b.perkey AND d.storekey = b.storekey AND c.year = 2004 AND d.city LIKE 'San J%' GROUP BY a.prod_name) AS sales2(product, total_04_sales) WHERE sales1.product = sales2.product ORDER BY sales1.product; |
| PRODUCT | JAN_04_SALES | TOTAL_04_SALES |
|---|---|---|
| Aroma Roma | 1653.00 | 21697.50 |
| Aroma Sheffield Steel Teapot | 120.00 | 1122.00 |
| Aroma Sounds Cassette | 58.50 | 866.00 |
| Aroma baseball cap | 7.95 | 2960.15 |
| Aroma t-shirt | 470.85 | 4470.50 |
| Assam Gold Blend | 652.00 | 11375.00 |
| Assam Grade A | 352.00 | 5429.00 |
| Breakfast Blend | 608.25 | 6394.75 |
| Cafe Au Lait | 1936.50 | 24050.50 |
| Colombiano | 2148.00 | 22528.50 |
| Darjeeling Number 1 | 867.50 | 8590.00 |
| Darjeeling Special | 1355.00 | 17787.50 |
| Demitasse Ms | 2163.00 | 35523.50 |
| Earl Grey | 540.50 | 6608.50 |
| English Breakfast | 393.00 | 5365.50 |
| Espresso Machine Italiano | 899.55 | 4397.80 |
| Expresso XO | 2935.50 | 27362.00 |
| French Press, 2-Cup | 104.65 | 1196.00 |
| French Press, 4-Cup | 19.95 | 1109.20 |
| Gold Tips | 440.00 | 5381.50 |
| Irish Breakfast | 703.25 | 7455.50 |
| ... | ||
Một giải pháp linh hoạt hơn: Các truy vấn phụ trong mệnh đề FROM
Một truy vấn phụ là biểu thức truy vấn bất kỳ trong dấu ngoặc xuất hiện bên trong câu hỏi khác. Một truy vấn phụ đôi khi được gọi là một truy vấn bên trong. Truy vấn bên trong hoạt động bên trong truy vấn phía ngoài, hay như là truy vấn con của một truy vấn cha mẹ.
Một giá trị thường được so sánh với một tổng của một tập hợp các giá trị. Ví dụ truy vấn so sánh doanh thu sản phẩm ở San Jose trong tháng Giêng 2004 với doanh thu ở San Jose suốt cả năm 2004. Loại truy vấn này yêu cầu các phép gộp hỗn hợp; bởi vậy, không thể viết loại truy vấn đó bằng các biểu thức CASE vì biểu thức CASE phải hoạt động theo các giá trị bên trong một nhóm đơn hay một phạm vi. Thay vào đó, các truy vấn phụ trong mệnh đề FROM được dùng để thực hiện so sánh.
| Chú ý quan trọng: Bất kỳ truy vấn nào mà có thể được biểu diễn như một truy vấn phụ trong mệnh đề FROM cũng có thể được biểu diễn như một truy vấn phụ trong danh sách chọn lựa, như sẽ cho thấy ở phần sau trong hướng dẫn này. |
Ví dụ truy vấn dựa vào tính linh hoạt của biểu thức truy vấn trong SQL tiêu chuẩn để kết nối các kết quả của hai truy vấn phụ. Để biết thêm thông tin chi tiết về các biểu thức truy vấn, xem SQL Reference Guide .
Các bảng dẫn xuất từ kết quả đánh giá của các truy vấn phụ có thể được kết nối với các tham chiếu bảng khác. Với mục đích này, một truy vấn phụ trong mệnh đề FROM phải có một tên tương quan. Ví dụ, các truy vấn phụ trong ví dụ này được đánh giá thành các bảng sau đây:
sales1(product, jan_04_sales) sales2(product, total_04_sales) |
Phép nối các bảng này (qua cột Product) tạo ra một bảng phát sinh không tên có ba cột, là nguồn của ba mục của danh sách chọn lựa trong truy vấn chính:
product, jan_04_sales, total_04_sales |