如何使用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數據庫的查詢優化及分頁算法
 
SQL Server 2005中查詢並修改數據的不合理設計
在SQL Server 2000中,我們想在數據庫表中直接修改數據,一般的操作方法是:在SQL Server 企業管理中,選擇相應的表,點擊右鍵,在“打開表”中選擇“查詢”,在SQL編輯窗口中輸入SQL語句找到要修改的記錄,然後在結...查看完整版>>SQL Server 2005中查詢並修改數據的不合理設計
 
使用sql-server進行分布式查詢(鏈接服務器)
可以使用sql-server企業管理器進行建立,注意其中的rpc及rpc out兩項,也可以使用sql語句來完成定義,主要涉及到三個存儲過程sp_addlinkedserver,sp_serveroption和sp_addlinkedsrvlogin,以下是三個存儲過程的語法...查看完整版>>使用sql-server進行分布式查詢(鏈接服務器)
 
[Sql server] 使用技巧:快速有條件刪除海量數據
最近有個朋友問我,他說他在SQLSERVER刪除幾百萬到幾千萬數據是顯的很慢,幫他分析了一下,提了一些以下意見,或許對很多人有用,再者也好長沒寫過BLOG了,一起探討一下 如果你的硬盤空間小,並且不想設置數據庫的日...查看完整版>>[Sql server] 使用技巧:快速有條件刪除海量數據
 
使用ADO操作SQL SERVER 通過'OLE DB 訪問 ACCESS 數據庫 ,實現數據交換
使用的存儲過程簡介1、sp_addlinkedserver --- 爲SQL SERVER 添加一個Link Server2、sp_addlinkedsrvlogin --- 爲Link Server 添加一個 Login3、sp_droplinkedsrvlogin --- 刪除Link Server的Login4、sp_dropserver ...查看完整版>>使用ADO操作SQL SERVER 通過'OLE DB 訪問 ACCESS 數據庫 ,實現數據交換
 
 
回到王朝網路移動版首頁