这本书差20页就看完了。本来以为这本书的主题是sql server 2005的t-sql的讲解,读完后发现不是。书中并没有系统讲解t-sql。前三章讲查询的原理,后面六章把常见的sql问题分类,每章一类:第4章子查询、表表达式和排名函数,第5章联接和集合操作,第6章聚合和旋转数据,第7章TOP和ALLPY,第8章数据修改,第9章图、树、层次结构和递归查询。
作者在序言中说过,仔细阅读本书,并且花些时间做书中的练习,可以在短时间内掌握作者十几年积累的经验。我看完本书并且基本把书中的代码看过一遍,感觉确实学到了作者的许多经验,作者经验非常丰富。许多解决方案表现出来的不光是作者在sql上的技巧,其中的算法也很值得学习。另外许多问题都给出sql server 2000下的解决方案和sql server 2005下的解决方案。下面举两个例子:
1。快速生成一个数据表,只有一列,这一列的值从1到8000,sql只需要执行14次(第一条sql插入数据1,后面12次把2的12次方4096以内的数据插入,后面剩下的8000-4096个数字一次生成)而不是8000次:
SET NOCOUNT ON;
USE tempdb;
GO
IF OBJECT_ID('dbo.Nums') IS NOT NULL
DROP TABLE dbo.Nums;
GO
CREATE TABLE dbo.Nums(n INT NOT NULL PRIMARY KEY);
DECLARE @max AS INT, @rc AS INT;
SET @max = 8000;
SET @rc = 1;
INSERT INTO Nums VALUES(1);
WHILE @rc * 2 <= @max
BEGIN
INSERT INTO dbo.Nums SELECT n + @rc FROM dbo.Nums;
SET @rc = @rc * 2;
END
INSERT INTO dbo.Nums
SELECT n + @rc FROM dbo.Nums WHERE n + @rc <= @max;
GO
2。对于递归结构的表,作者介绍了常见的设计方式(递归)之外,还介绍了Joe Celko提出的嵌套集合模型。并给出了自己的更快速的实现方法。这个模型在数的每个节点上设置两个值:左值和右值。左值小于所有的下级节点的左值,右值大于所有的下级节点的右值,最终计算递归关系非常快。当然这种模型中一个节点的改变会导致平均一半的节点需要重新计算左值和右值,因此不适合需要经常实时变化的数据表。具体的sql比较长,有兴趣可以看书或者下载本书的源代码。