如何使用SQL Server數據庫嵌套子查詢

很多SQL Server程序員對子查詢(subqueries)的使用感到困惑,尤其對于嵌套子查詢(即子查詢中包含一個子查詢)。現在,就讓我們追本溯源地探究這個問題。

有兩種子查詢類型:標准和相關。標准子查詢執行一次,結果反饋給父查詢。相關子查詢每行執行一次,由父查詢找回。在本文中,我將重點討論嵌套子查詢(nested subqueries)(我將在以後介紹相關子查詢)。

試想這個問題:你想生成一個賣平墊圈的銷售人員列表。你需要的數據分散在四個表格中:人員.聯系方式(Person.Contact),人力資源.員工(HumanResources.Employee),銷售.銷售訂單標題(Sales.SalesOrderHeader),銷售.銷售訂單詳情(Sales.SalesOrderDetail)。在SQL Server中,你從內壓式(outside-in)寫程序,但從外壓式(inside-out)開始考慮非常有幫助,即可以一次解決需要的一個語句。

如果從內到外寫起,可以檢查Sales.SalesOrderDetail表格,在LIKE語句中匹配産品數(ProductNumber)值。你將這些行與Sales.SalesOrderHeader表格連接,從中可以獲得銷售人員IDs(SalesPersonIDs)。然後使用SalesPersonID連接SalesPersonID表格。最後,使用ContactID連接Person.Contact表格。

USE AdventureWorks ;

GO

SELECT DISTINCT c.LastName, c.FirstName

FROM Person.Contact c JOIN HumanResources.Employee e

ON e.ContactID = c.ContactID WHERE EmployeeID IN

(SELECT SalesPersonID

FROM Sales.SalesOrderHeader

WHERE SalesOrderID IN

(SELECT SalesOrderID

FROM Sales.SalesOrderDetail

WHERE ProductID IN

(SELECT ProductID

FROM Production.Product p

WHERE ProductNumber LIKE'FW%')));

GO

這個例子揭示了有關SQL Server的幾個絕妙事情。你可以發現,可以用IN()參數替代SELECT 語句。在本例中,有兩次應用,因此創建了一個嵌套子查詢。

我是標准化(normalization)的發燒友,盡管我不接受其荒謬的長度。由于標准化具有各種查詢而增加了複雜性。在這些情況下子查詢就顯得非常有用,嵌套子查詢甚至更加有用。

當你需要的問題分散于很多表格中時,你必須再次將它們拼在一起,這時你可能發現嵌套子程序就很有用。

 
如何使用SQL Server數據庫查詢累計值
有這樣一個要求,它要創建一個SQL Server查詢,其中包括基于事件時刻的累計值。典型的例子就是一個銀行賬戶,因爲你每一次都是在不同的時間去存錢和取錢。對任意一個賬戶來說,在某個時間點都要算出它的借(存款)和...查看完整版>>如何使用SQL Server數據庫查詢累計值
 
數據庫中如何使用SQL查詢連續號碼段
在ITPUB上有一則非常巧妙的SQL技巧,學習一下,記錄在這裏。最初的問題是這樣的:我有一個表結構,fphm,kshm2014,000000012014,000000022014,000000032014,000000042014,000000052014,000000072014,000000082014,0000...查看完整版>>數據庫中如何使用SQL查詢連續號碼段
 
怎樣使用 SQL Server 數據庫嵌套子查詢
  很多SQL Server程序員對子查詢(subqueries)的使用感到困惑,尤其對于嵌套子查詢(即子查詢中包含一個子查詢)。現在,就讓我們追本溯源地探究這個問題。  有兩種子查詢類型:標准和相關。標准子查詢執行一次,結...查看完整版>>怎樣使用 SQL Server 數據庫嵌套子查詢
 
SQL Server數據庫查詢優化的常用方法總結
SQL Server數據庫查詢優化的常用方法總結: 本文中,abigale代表查詢字符串,ada代表數據表名,alice代表字段名。 技巧一: 問題類型:ACCESS數據庫字段中含有日文片假名或其它不明字符時查詢會提示內存溢出。 解決方...查看完整版>>SQL Server數據庫查詢優化的常用方法總結
 
SQL Server數據庫的查詢優化及分頁算法
  探討如何在有著1000萬條數據的MS SQL SERVER數據庫中實現快速的數據提取和數據分頁。以下代碼說明了我們實例中數據庫的“紅頭文件”一表的部分數據結構:CREATE TABLE . (  --TGongwen是紅頭文件表名 IDENTIT...查看完整版>>SQL Server數據庫的查詢優化及分頁算法