關聯子查詢與嵌套子查詢

來源:互聯網
上載者:User

相互關聯子查詢與嵌套子查詢經典SQL語句
Posted on 2007-01-12 15:01 hhq80 閱讀(277) 評論(1)  編輯 收藏 所屬分類: SQL資料庫技術

為每一行資料執行一次並返回它的記錄。然後,外部查詢根據返回的記錄做出決策。

下面我們使用Northwind 資料庫作為一個例子。我們需要列出由每位客戶下達的最新
的訂單。

SELECT o1.CustomerID, o1.OrderID, o1.OrderDate
FROM Orders o1
WHERE o1.OrderDate =
(SELECT Max(OrderDate)
FROM Orders o2
WHERE o2.CustomerID = o1.CustomerID)

對於外部查詢返回的每行資料,內部查詢都會執行,條件是限制其結果集與
CustomerID匹配。Max() 調用將結果集限制為感興趣的一行資料。

如果有500位客戶下達了訂單,內部查詢將執行500次——每個CustomerID執行一次。
現在我們已經有了答案:返回90行資料,也就是說這90條資料中每條資料都代表一位
客戶下達了一個訂單。

你可以很容易地對這個查詢進行擴充。例如,你可能想查詢每個客戶所下訂單的最新
兩個訂單。在這種情況下,需要將內部查詢改為以下這種形式:

SELECT o1.CustomerID, o1.OrderID, o1.OrderDate
FROM Orders o1
WHERE o1.OrderDate IN(
SELECT TOP 2 o2.OrderDate
FROM Orders o2
WHERE o2.CustomerID = o1.CustomerID)
ORDER BY CustomerID

你可以以不同方式最佳化這個例子,以避免開銷很大的 IN() 謂詞。

以我的經驗來看,很多開發人員在學習完相互關聯子查詢之後很快就會忘記其概念。
這真的很讓人感到遺憾,因為相互關聯子查詢可以很簡單很優雅地回答難度很大的問
題。

我的意見是這個文法可行,並且用一個 SQL 陳述式就可以查詢出期望的結果。這使我想
到了一位開發經理反覆跟我說的一句話:“第一個版本是使其能夠運行,第二個版本
是使其能夠更快地運行。”

嵌套子查詢例子:
select nbbm,(select ypm+gg from zy_sys2_ypzdk where
zy_sys2_ypzdk.nbbm=zy_yp1_sfmx.nbbm) as pm,bzsl from
zy_yp1_sfmx

查詢客戶最新的五個訂單(擴充),這個也非常經典
SELECT o1.CustomerID, o1.OrderID, o1.OrderDate
FROM Orders o1
WHERE o1.OrderDate IN(
SELECT TOP 5 o2.OrderDate
FROM Orders o2
WHERE o2.CustomerID = o1.CustomerID)
ORDER BY CustomerID

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/tpf01/archive/2008/08/18/2792224.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.