返回“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).