您的位置:首页 > 产品设计 > UI/UE

SqlServer 2005 T-SQL Query 学习笔记(9)

2010-02-26 10:29 477 查看
Tiebreakers情况:即在某一条件相同的情况下(比如GROUP BY),在数据表里找到根据另外几个条件(先后关系)的最大(最小)值。

作者展示了解决这样的问题的方法,这个方法的好处就是,不需要进行额外的INDEX的编码。

比如要达到这样一个查询:

SELECT EmployeeID, MAX(OrderDate, OrderID, CustomerID, RequiredDate)
FROM dbo.Orders
GROUP BY EmployeeID;


注意:上面的代码是错误的。

即查询除每个雇员的最新的订货日期(如果在相同的订货日期下选择最新的订单号,以此类推)。

可以这样写:

SELECT EmployeeID,
--注意:SUBSTRING(binstr,1,8)->从INDEX=1开始取字节,取的长度为8
CAST(SUBSTRING(binstr, 1, 8)   AS DATETIME) AS OrderDate,
CAST(SUBSTRING(binstr, 9, 4)   AS INT)      AS OrderID,
CAST(SUBSTRING(binstr, 13, 10) AS NCHAR(5)) AS CustomerID,
CAST(SUBSTRING(binstr, 23, 8)  AS DATETIME) AS RequiredDate
--子查询通过把N个属性进行2元的累加转化,然后取最大(实际上是取最后的订单日期)
FROM (SELECT EmployeeID,
MAX(CAST(OrderDate        AS BINARY(8))
+ CAST(OrderID      AS BINARY(4))
+ CAST(CustomerID   AS BINARY(10))
+ CAST(RequiredDate AS BINARY(8))) AS binstr
FROM dbo.Orders
GROUP BY EmployeeID) AS D;


外查询实际上是剥离了内查询查出来的2元组合字符串,然后进行对应的分解,转化成应对的字符格式。

以上是几个条件(ORDERDATA,ORDERID,CUSTOMERID,REQUIREDDATE)依次排列取最大的情况,如果我们要使其中某一条件取最小的情况呢?

MAX(CAST(OrderDate        AS BINARY(8))
+ CAST(2147483647 - OrderID AS BINARY(4))
+ CAST(CustomerID   AS BINARY(10))
+ CAST(RequiredDate AS BINARY(8))) AS binstr


如上所示,用某值进行相减,即取到最小值。

Technorati 标签: sql2005,t-sql,query
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: