=================================版权声明=================================

版权声明:原创文章 禁止转载 

请通过右侧公告中的“联系邮箱(wlsandwho@foxmail.com)”联系我

勿用于学术性引用。

勿用于商业出版、商业印刷、商业引用以及其他商业用途。                   

 

本文不定期修正完善。

本文链接:http://www.cnblogs.com/wlsandwho/p/5141395.html

耻辱墙:http://www.cnblogs.com/wlsandwho/p/4206472.html

=======================================================================

http://www.cnblogs.com/wlsandwho/p/5141395.html

放大图:http://www.cnblogs.com/wlsandwho/p/5141395.html

当准DBA往群里贴问题的时候,我是怀疑的,果然被我猜到了。http://www.cnblogs.com/wlsandwho/p/5141395.html

不管怎样,我相信,每一个我遇到的难题,对我来说都是一次提升的机会。http://www.cnblogs.com/wlsandwho/p/5141395.html

=======================================================================

上代码:http://www.cnblogs.com/wlsandwho/p/5141395.html

 1 --by wls
 2 --20160119
 3 --网络代码有风险
 4 --复制粘贴须谨慎
 5 USE tempdb
 6 GO
 7 
 8 IF OBJECT_ID('t_TestbyWLS','U') IS NOT NULL
 9 DROP TABLE t_TestbyWLS
10 GO
11 
12 CREATE TABLE t_TestbyWLS(cname NVARCHAR(10),pname NVARCHAR(10),wday INT)
13 GO
14 
15 INSERT INTO t_TestbyWLS VALUES
16  ('A','a',1)
17 ,('B','b',1)
18 ,('C','c',1)
19 ,('D','d',2)
20 ,('A','a',2)
21 ,('B','e',2)
22 ,('C','c',3)
23 ,('D','d',4)
24 GO
25 
26 WITH TempCP
27 AS
28 (
29 SELECT cname,pname,cname+pname AS cp,wday FROM t_TestbyWLS
30 )
31 ,TempVal
32 AS
33 (
34 SELECT DISTINCT cname,pname,val FROM tempcp AS t CROSS APPLY(    SELECT    CASE 
35                                                                             WHEN t.cp=TempCP.cp AND t.wday=1 AND TempCP.wday=2 THEN 2 
36                                                                             WHEN t.cp=TempCP.cp AND t.wday=1 AND TempCP.wday=3 THEN 3 
37                                                                             WHEN t.cp=TempCP.cp AND t.wday=1 AND TempCP.wday=4 THEN 4 
38                                                                             WHEN t.cp=TempCP.cp AND t.wday=2 AND TempCP.wday=4 THEN 3 
39                                                                             ELSE 1
40                                                                         END AS val 
41                                                                 FROM tempcp) AS a 
42 )
43 SELECT cname,pname,MAX(val) AS val FROM TempVal GROUP BY cname,pname

CROSS APPLY的好处是可以像给函数传参数一样向括号里传筛选条件,实际上MSDN文档中就是自定义了一个函数,我这里直接写了。http://www.cnblogs.com/wlsandwho/p/5141395.html

这样一个显而易见的好处是,可以通过函数封装具体算法来减少代码变化对外部语句的影响。

最大的好处是:它是针对行集的!它针对每一行进行操作!(不负责评论:我觉得恰当使用可以减少游标的出场率)

新合成的那个cp字段没什么用,最终修改修改可以去掉的。

最终修改后的代码:

 1 WITH TempVal
 2 AS
 3 (
 4 SELECT DISTINCT cname,pname,val FROM t_TestbyWLS AS t CROSS APPLY(    SELECT    CASE
 5                                                                                 WHEN t.cname=t_TestbyWLS.cname AND t.pname=t_TestbyWLS.pname AND t.wday=1 AND t_TestbyWLS.wday=2 THEN 2 
 6                                                                                 WHEN t.cname=t_TestbyWLS.cname AND t.pname=t_TestbyWLS.pname AND t.wday=1 AND t_TestbyWLS.wday=3 THEN 3 
 7                                                                                 WHEN t.cname=t_TestbyWLS.cname AND t.pname=t_TestbyWLS.pname AND t.wday=1 AND t_TestbyWLS.wday=4 THEN 4 
 8                                                                                 WHEN t.cname=t_TestbyWLS.cname AND t.pname=t_TestbyWLS.pname AND t.wday=2 AND t_TestbyWLS.wday=4 THEN 3 
 9                                                                           ELSE 1
10                                                                              END AS val 
11                                                                     FROM t_TestbyWLS) AS a 
12 )
13 SELECT cname,pname,MAX(val) AS val FROM TempVal GROUP BY cname,pname

现在简洁多了。http://www.cnblogs.com/wlsandwho/p/5141395.html

执行计划也很好看?http://www.cnblogs.com/wlsandwho/p/5141395.html

我不会SQL优化,但是执行计划里的嵌套循环应该是有问题的,不然为何会有个叹号。

MSDN手册的描述如下:

快要超出我的SQL知识储备范围了,先去看看书吧。

作为一只C++,混SQL群压力还是蛮大的。http://www.cnblogs.com/wlsandwho/p/5141395.html

非专业SQL 不求高效 但求能跑 http://www.cnblogs.com/wlsandwho/p/5141395.html

=======================================================================

20160125-01 更正 wlsandwho@foxmail.com 王林森 wlsandwho

看了下之前代码的执行计划,循环嵌套那里是有问题的。wlsandwho@foxmail.com 王林森 wlsandwho

略微改了改。wlsandwho@foxmail.com 王林森 wlsandwho

 1 WITH TempVal
 2 AS
 3 (
 4 SELECT DISTINCT cname,pname,val FROM t_TestbyWLS AS t CROSS APPLY(    SELECT    CASE
 5                                                                                     WHEN t.wday=1 AND t_TestbyWLS.wday=2 THEN 2 
 6                                                                                     WHEN t.wday=1 AND t_TestbyWLS.wday=3 THEN 3 
 7                                                                                     WHEN t.wday=1 AND t_TestbyWLS.wday=4 THEN 4 
 8                                                                                     WHEN t.wday=2 AND t_TestbyWLS.wday=4 THEN 3 
 9                                                                                       ELSE 1
10                                                                                 END AS val 
11                                                                        FROM t_TestbyWLS 
12                                                                        WHERE t.cname=t_TestbyWLS.cname AND t.pname=t_TestbyWLS.pname)  AS a 
13 )
14 SELECT cname,pname,MAX(val) AS val FROM TempVal GROUP BY cname,pname
15 GO

现在执行计划正常了。wlsandwho

=======================================================================

因为总是有爬虫网站抓取我的博客,无视我的版权,我很伤心,所以文章最后只能这样结尾。

下面开始点名:

 

Asp.net教程_mvc4_C#_Ado.net_seo_Java_HTML CSS教程
www.tzwhx.com
www.th7.cn
解决方案网
帮客之家 | IT技术 建站编程 电脑教程 www.bkjia.com
软件开发,程序错误,exception
www.java123.net
一键重装系统_打造智能化重装系统软件
www.bitscn.com

 

=======================================================================

(友情支持请扫描这个)http://www.cnblogs.com/wlsandwho/p/5141395.html

微信扫描上方二维码捐赠

=======================================================================

下面是无耻的爬虫网站网页