当前位置: 首页 > 图文教程 > 数据库 > MSSQL > 教你在SQL Server中由原子建立分子查询

MSSQL
正确配置和使用SQL mail
关于DTS导入导出丢失默认值等对象
TOP N 和SET ROWCOUNT N 哪个更快
如何在视图中使用ORDER BY短语
如何区分大小写比较?
如何将作为字符串保存的IP地址变为二进制数值?
如何随机选取n条记录或者对记录作随机排序?
SQL脚本生成的一些BUG
如何使Microsoft SQL Server的日志文件不会增大?
利用事务日志来恢复Update、Delete误操作引起的数据丢
关于MSSQL占用过多内存的问题
SQL Server非正常删除日志文件(ldf)恢复方法
处理孤立用户的存储过程
1069错误(由于登录失败而无法启动服务)解决方法
SQL Server 7.0数据库的六种数据移动方法
利用SQL Server的扩展属性象access一样显示列的注释
Stored Procedure(存储过程)编写经验和优化措施
更新你的联机丛书
关于SQL Server中几个未公布的访问注册表的扩展存储过
存储过程替换text,ntext列中的字符串

MSSQL 中的 教你在SQL Server中由原子建立分子查询


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-30   浏览: 122 ::
收藏到网摘: n/a

每位SQL Server开发员都有自己的首选操作方法。我的方法叫做分子查询。这些是由原子查询组合起来的查询,通过它们我可以处理一个表格。将原子组合起来,可以建立分子。当然也会有限制(化学家所称的化合价),但一般来说,这个原理还是适用的。

在本文中,我将探讨这种策略的几种变化。我从最基本的内容开始(即最详细的内容),然后逐步深化。为让你了解这种方法的灵活性,我会在不同层次使用几种技巧。(警告:这并不是唯一的解决方法,我只是在讨论一些可行的选择。)

我从普遍使用的数据库Northwind开始(虽然为了保留原貌,我把它复制到Northwind_New中,实际这才是我使用的数据库。)在我的拷贝中,我做出这些重要的修改。

我删除了复合主键,增加一个叫做PK的新列,并将其设为Identity列。
我增加了一个称作ExtendedAmount的计算列。
列表A中包含建立这个新表格的新建(Create)语句。我用这个命令将它和值从原始表格中迅速移植出来:

INSERT INTO [Northwind_New].[dbo].[OrderDetails_New]

SELECT * FROM [Northwind_New].[dbo].[Order Details]

既然我有一个多行的表格,是时候开始实验了。(一旦新列ExtendedAmount被计算,其值会自动移植。)最初,我想用OrderID计算ExtendedAmount列的总数。我建立一个视图,如列表B所示。

我每行得到一个OrderID,ExtendedAmount的列数得到总计。(称之为OrderAmount,将航运,税收等相加得到OrderTotal)。
我会在等式中引入一个表格UDF,如列表C所示。注意,我可以用两种方法调用函数:提交CustomerID将表格限定为那个顾客的订单,或提交一个NULL获得所有顾客订单列表。如果我提交CustomerID,那么订单列表就出现在OrderDate中;如果我提交NULL,列表就被分组并在CustomerID中由OrderDate排序。

更深入一步,我每个顾客打印一行,用一列显示每名顾客的总销售额。查看列表D。并不是所有项目都得到组合。在最外层,我能够以两种方式调用这个函数:提交合法CustomerID或UNLL。以下是它们各自的实例:

SELECT CustomerID, CustomerTotal

FROM DBO.CustomerGrandTotal_fnt(null)

SELECT CustomerID, CustomerTotal

FROM DBO.CustomerGrandTotal_fnt('VINET')

现在你有了一组精确的工具来帮助你挖掘适当层次的细节。计算列OrderDetails.ExtendedAmount隐藏了一个复杂层次,从那我又深入到我希望隐藏的细节。这就是我把这些对象叫做原子和分子查询的原因。我使用“查询”一词来概括这样一个事实,即讨论的对象是视图还是表格UDF并不重要。(虽然由于命名规则,suffix _fnt表示一个表格UDF,而suffix _vue表示一个视图。)

必须承认,Northwind数据库中没有大量的行,但我认为这种技巧可以得到很好地扩充。更为重要的是,我喜欢它提供的粒度。我能够做我想做的,并按要求重新使用或重新组合原子。