返回“ASP.NET 2.0數據教程目錄”
導言:
在關系數據庫裡,我們處理的數據通常跨越了幾個數據表。舉 例:當展示產品信息時我們很可能想列出每個產品相應的category以及供應商的 名稱等.誠然,Products表裡包含有CategoryID 和SupplierID值,但是事實上的 category以及supplier names分別定義在Categories表和Suppliers表裡. 要從其 它的相關表裡獲取信息,我們可以使用correlated subqueries或JOINs.一條 correlated subquerie就是一個鑲套的SELECT,引用外部查詢(outer query)的列 .比如在第一章《Creating a Data Access Layer》裡我們在 ProductsTableAdapter的主查詢裡使用2條correlated subqueries來返回每個產 品的category 以及supplier names.而JOIN是一SQL構造,將2個不同的表的相關 聯的rows進行合並.在第47章《Querying Data with the SqlDataSource Control 》裡,我們使用JOIN來顯示每個產品的category信息.
我們避免在 TableAdapters裡使用JOIN是由於TableAdapter向導自動生成的INSERT, UPDATE, 以及DELETE statements有其局限性.具體來說,如果TableAdapter的主查詢裡包 含了任何的JOIN,那麼TableAdapter就不能為它的InsertCommand, UpdateCommand,以及DeleteCommand屬性自動地創建 ad-hoc SQL statements或存 儲過程.在開始之前,我們先簡要地對correlated subqueries和JOIN進行比 較.
比較Correlated Subqueries和JOINs
我們知道在第一章的 Northwind DataSet數據集裡創建的ProductsTableAdapter使用correlated subqueries來返回每個產品對應的category 和 supplier name。該 ProductsTableAdapter的主查詢如下:
SELECT ProductID, ProductName, SupplierID, CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
(SELECT CategoryName FROM Categories WHERE Categories.CategoryID =
Products.CategoryID) as CategoryName,
(SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID =
Products.SupplierID) as SupplierName
FROM Products
我們注意這2個correlated subqueries——“(SELECT CategoryName FROM Categories WHERE Categories.CategoryID = Products.CategoryID)” 以及“ (SELECT CompanyName FROM Suppliers WHERE Suppliers.SupplierID = Products.SupplierID),都是一個SELECT查詢,返回一個單一值,並作為外部 SELECT statement的額外的列.
此外,我們可以使用JOIN來返回每個產品 的supplier 以及category name,下面的查詢與上面的代碼效果一樣,不過用的 是JOIN:
SELECT ProductID, ProductName, Products.SupplierID, Products.CategoryID,
QuantityPerUnit, UnitPrice, UnitsInStock, UnitsOnOrder,
ReorderLevel, Discontinued,
Categories.CategoryName,
Suppliers.CompanyName as SupplierName
FROM Products
LEFT JOIN Categories ON
Categories.CategoryID = Products.CategoryID
LEFT JOIN Suppliers ON
Suppliers.SupplierID = Products.SupplierID
JOIN基於某種標 准將一個表的記錄與另一個表的記錄合並起來.比如上述代碼中,“LEFT JOIN Categories ON Categories.CategoryID = Products.CategoryID”就 指示SQL Server將每一條product記錄與category記錄合並起來,標准是category 記錄的CategoryID值與product記錄CategoryID值相吻合.在合並的結果裡,我們 可以對每個產品相應的category fields進行處理(比如CategoryName).