在ASP.NET 2.0中操作数据之六十七:在TableAdapters中使用JOINs

时间:2021-05-26

  在关系数据库里,我们处理的数据通常跨越了几个数据表。举例:当展示产品信息时我们很可能想列出每个产品相应的category以及供应商的名称等.诚然,Products表里包含有CategoryID 和SupplierID值,但是事实上的category以及supplier names分别定义在Categories表和Suppliers表里. 要从其它的相关表里获取信息,我们可以使用correlated subqueries或JOINs.一条correlated subquerie就是一个镶套的SELECT,引用外部查询(outer query)的列.比如在第一章《创建一个数据访问层》里我们在ProductsTableAdapter的主查询里使用2条correlated subqueries来返回每个产品的category 以及supplier names.而JOIN是一SQL构造,将2个不同的表的相关联的rows进行合并.在第46章《使用SqlDataSource控件检索数据》里,我们使用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 SupplierNameFROM 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 SupplierNameFROM 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).

  注意:JOIN通常用来从相关的数据库查询数据.如果你对JOIN语法比较陌生或者对其用法复习提高,我推荐你阅读W3 Schools论坛上的文章《SQL Join tutorial》(http://的创始人,自1998年以来一直应用 微软Web技术。大家可以点击查看全部教程《[翻译]Scott Mitchell 的ASP.NET 2.0数据教程》,希望对大家的学习ASP.NET有所帮助。

声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。

相关文章