<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><title type="text">博客园_风继续吹</title><subtitle type="text">不忍离别</subtitle><id>http://feed.cnblogs.com/blog/u/36161/rss</id><updated>2012-06-01T07:41:19Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><generator>feed.cnblogs.com</generator><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/"/><link rel="self" type="application/atom+xml" href="http://feed.cnblogs.com/blog/u/36161/rss"/><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/06/01/2530871.html</id><title type="text">BI.ver.1.实战系列. 用户开户以及登陆的分析</title><summary type="text">这一版, 我们主要实现两个功能. 分析用户的登陆情况以及开户情况. 用到的主要是系统的用户表以及登陆日志表.</summary><published>2012-06-01T07:41:00Z</published><updated>2012-06-01T07:41:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/06/01/2530871.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/06/01/2530871.html"/><content type="html">&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201206/20120601154118126.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201206/201206011541197519.png" width="726" height="320" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;这一版, 我们主要实现两个功能. 分析用户的登陆情况以及开户情况. &lt;/p&gt;  &lt;p&gt;用到的主要是系统的用户表以及登陆日志表. &lt;/p&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2530871.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/06/01/2530871.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/04/16/2451751.html</id><title type="text">sql server 2008语言基础: output表达式</title><summary type="text">, 除了修改数据以外, 一般不会希望修改语句后再做其他的事情. 不过有时候, 我们希望能够从修改过的行中返回数据, 这个功能可能也有一定的用处. 比如update语句, 除了修改数据以外, 对于发生更新的列, update语句还可以返回这个列更新之前和更新之后的值. 在排除问题, 审核等其他情况下, 这样的功能很有用处. 带有output的insert语句. @@identity只能返...</summary><published>2012-04-16T06:58:00Z</published><updated>2012-04-16T06:58:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/04/16/2451751.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/04/16/2451751.html"/><content type="html">&lt;p&gt;, 除了修改数据以外, 一般不会希望修改语句后再做其他的事情. 不过有时候, 我们希望能够&lt;strong&gt;从修改过的行中返回数据,&lt;/strong&gt; 这个功能可能也有一定的用处.&lt;/p&gt;  &lt;p&gt;比如update语句, 除了修改数据以外, 对于发生更新的列, &lt;strong&gt;update语句还可以返回这个列更新之前和更新之后的值.&lt;/strong&gt; 在排除问题, 审核等其他情况下, 这样的功能很有用处.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;带有output的insert语句.&lt;/p&gt;  &lt;p&gt;@@identity只能返回当前会话最后生产的标识列.&amp;#160; 如果一次性插入多条语句的话. 需要返回这些自动生产的标识列. 那么outpu就派上用场了.&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;span class="kwrd"&gt;declare&lt;/span&gt; @temp &lt;span class="kwrd"&gt;table&lt;/span&gt;(k &lt;span class="kwrd"&gt;int&lt;/span&gt;, v nvarchar(200))  insert &lt;span class="kwrd"&gt;into&lt;/span&gt; t1(datacol)  &lt;span class="kwrd"&gt;output&lt;/span&gt; inserted.keycol, inserted.datacol  &lt;span class="kwrd"&gt;into&lt;/span&gt; @temp  &lt;span class="kwrd"&gt;select&lt;/span&gt; lastname &lt;span class="kwrd"&gt;from&lt;/span&gt; TSQLFundamentals2008.hr.Employees &lt;span class="kwrd"&gt;where&lt;/span&gt; country=&lt;span class="str"&gt;'uk'&lt;/span&gt;  &amp;#160;  &lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; @temp&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/20120416145822364.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204161458224857.png" width="144" height="99" /&gt;&lt;/a&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;带有output的delete语句和update语句也大同小异.&lt;/p&gt;&lt;p&gt;delete语句能操作deleted临时表. 而update的本质是delete和insert一次能操作inserted和updated两张表.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;带有output的merge子句.&lt;/p&gt;&lt;p&gt;在merge子句的output输出中可以调用@action函数. 会返回一个代表相应操作的字符串(insert, update, delete)&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;练习.&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2451751.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/04/16/2451751.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/04/13/2445461.html</id><title type="text">sql server 2008语言基础: 再回首之Sql 2008的merge关键字</title><summary type="text">数据脚本为 IF OBJECT_ID('dbo.Customers', 'U') IS NOT NULL DROP TABLE dbo.Customers; GO CREATE TABLE dbo.Customers ( custid INT NOT NULL, companyname VARCHAR(25) NOT NULL, ph...</summary><published>2012-04-13T03:15:00Z</published><updated>2012-04-13T03:15:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/04/13/2445461.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/04/13/2445461.html"/><content type="html">&lt;p&gt;数据脚本为&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;span class="kwrd"&gt;IF&lt;/span&gt; OBJECT_ID(&lt;span class="str"&gt;'dbo.Customers'&lt;/span&gt;, &lt;span class="str"&gt;'U'&lt;/span&gt;) &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;DROP&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; dbo.Customers;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;#160;  &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; dbo.Customers  (    custid      &lt;span class="kwrd"&gt;INT&lt;/span&gt;         &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    companyname &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(25) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    phone       &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(20) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    address     &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(50) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; PK_Customers &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt;(custid)  );  &amp;#160;  INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; dbo.Customers(custid, companyname, phone, address)  &lt;span class="kwrd"&gt;VALUES&lt;/span&gt;    (1, &lt;span class="str"&gt;'cust 1'&lt;/span&gt;, &lt;span class="str"&gt;'(111) 111-1111'&lt;/span&gt;, &lt;span class="str"&gt;'address 1'&lt;/span&gt;),    (2, &lt;span class="str"&gt;'cust 2'&lt;/span&gt;, &lt;span class="str"&gt;'(222) 222-2222'&lt;/span&gt;, &lt;span class="str"&gt;'address 2'&lt;/span&gt;),    (3, &lt;span class="str"&gt;'cust 3'&lt;/span&gt;, &lt;span class="str"&gt;'(333) 333-3333'&lt;/span&gt;, &lt;span class="str"&gt;'address 3'&lt;/span&gt;),    (4, &lt;span class="str"&gt;'cust 4'&lt;/span&gt;, &lt;span class="str"&gt;'(444) 444-4444'&lt;/span&gt;, &lt;span class="str"&gt;'address 4'&lt;/span&gt;),    (5, &lt;span class="str"&gt;'cust 5'&lt;/span&gt;, &lt;span class="str"&gt;'(555) 555-5555'&lt;/span&gt;, &lt;span class="str"&gt;'address 5'&lt;/span&gt;);  &amp;#160;  &lt;span class="kwrd"&gt;IF&lt;/span&gt; OBJECT_ID(&lt;span class="str"&gt;'dbo.CustomersStage'&lt;/span&gt;, &lt;span class="str"&gt;'U'&lt;/span&gt;) &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;DROP&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; dbo.CustomersStage;  &lt;span class="kwrd"&gt;GO&lt;/span&gt;  &amp;#160;  &lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; dbo.CustomersStage  (    custid      &lt;span class="kwrd"&gt;INT&lt;/span&gt;         &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    companyname &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(25) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    phone       &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(20) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    address     &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(50) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,    &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; PK_CustomersStage &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt;(custid)  );  &amp;#160;  INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; dbo.CustomersStage(custid, companyname, phone, address)  &lt;span class="kwrd"&gt;VALUES&lt;/span&gt;    (2, &lt;span class="str"&gt;'AAAAA'&lt;/span&gt;, &lt;span class="str"&gt;'(222) 222-2222'&lt;/span&gt;, &lt;span class="str"&gt;'address 2'&lt;/span&gt;),    (3, &lt;span class="str"&gt;'cust 3'&lt;/span&gt;, &lt;span class="str"&gt;'(333) 333-3333'&lt;/span&gt;, &lt;span class="str"&gt;'address 3'&lt;/span&gt;),    (5, &lt;span class="str"&gt;'BBBBB'&lt;/span&gt;, &lt;span class="str"&gt;'CCCCC'&lt;/span&gt;, &lt;span class="str"&gt;'DDDDD'&lt;/span&gt;),    (6, &lt;span class="str"&gt;'cust 6 (new)'&lt;/span&gt;, &lt;span class="str"&gt;'(666) 666-6666'&lt;/span&gt;, &lt;span class="str"&gt;'address 6'&lt;/span&gt;),    (7, &lt;span class="str"&gt;'cust 7 (new)'&lt;/span&gt;, &lt;span class="str"&gt;'(777) 777-7777'&lt;/span&gt;, &lt;span class="str"&gt;'address 7'&lt;/span&gt;);&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114221953.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114232609.png" width="280" height="221" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;上面的是目标表T， 下面的是源表S。 仔细观察， 发现t里面没有custid为6,7的行， 而且2,5行不一样。&lt;/p&gt;&lt;p&gt;那么， 用merge关键字的操作。 将会在T表中插入S表的custid为6,7两行， 并且修改2,5两行。&lt;/p&gt;--1. 把customersStage表(来源表)的内容的合并到Customers表(目标表)中. 更具体的说,&lt;br/&gt;--假设现在还想增加一些还不存在的客户, 和更新已经存在的客户的属性.&lt;br/&gt;--仔细观看已有的两张表。 发现目标表里面没有6,7. 并且2,5的属性有改动。&lt;br/&gt;merge &lt;span class="kwrd"&gt;into&lt;/span&gt; customers &lt;span class="kwrd"&gt;as&lt;/span&gt; t&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; customersStage &lt;span class="kwrd"&gt;as&lt;/span&gt; s&lt;br/&gt;&lt;span class="kwrd"&gt;on&lt;/span&gt; t.custid=s.custid&lt;br/&gt;&lt;span class="kwrd"&gt;when&lt;/span&gt; matched &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;update&lt;/span&gt; &lt;span class="kwrd"&gt;set&lt;/span&gt; t.companyname=s.companyname, t.phone=s.phone, t.[address]=s.[address]&lt;br/&gt;&lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; matched &lt;span class="kwrd"&gt;then&lt;/span&gt; insert (custid, companyname, phone, [address]) &lt;br/&gt;                        &lt;span class="kwrd"&gt;values&lt;/span&gt;( s.custid,s.companyname, s.phone, s.[address])&lt;br/&gt;;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;得到结果&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114271991.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114286202.png" width="272" height="135" /&gt;&lt;/a&gt;多了两行记录并且修改了两行记录。&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class="csharpcode"&gt;  --上面介绍了merge子句的两种匹配方式。  &lt;span class="rem"&gt;-- when matched 匹配时。 when not matched不匹配时。&lt;/span&gt;  &lt;span class="rem"&gt;-- 第三种子句。 when not mateched by source. 用于定义对于目标表的一个行， 在来源表中没有&lt;/span&gt;  &lt;span class="rem"&gt;-- 与之匹配的行时， 应该采取的操作。 一般去情况下是删除。&lt;/span&gt;  &lt;span class="rem"&gt;-- --如果target里面有, 但是源表没有的就删除. 有点类似于inner join的笛卡尔乘积, &lt;/span&gt;  -- 左边表里面存着记录, 但是右边表没有. 还是删除掉&lt;/div&gt;&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;现在我们重新新建这两张表。&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/20120413111428171.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114291350.png" width="280" height="221" /&gt;&lt;/a&gt; 发现目标表中有， 但是源表中没有的数据， 那么就删除掉。 发现T表中的1和4 要中枪了。&lt;/p&gt;&lt;div class="csharpcode"&gt;  merge &lt;span class="kwrd"&gt;into&lt;/span&gt; customers &lt;span class="kwrd"&gt;as&lt;/span&gt; t  &lt;span class="kwrd"&gt;using&lt;/span&gt; customersStage &lt;span class="kwrd"&gt;as&lt;/span&gt; s  &lt;span class="kwrd"&gt;on&lt;/span&gt; t.custid=s.custid  &lt;span class="kwrd"&gt;when&lt;/span&gt; matched &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;update&lt;/span&gt; &lt;span class="kwrd"&gt;set&lt;/span&gt; t.companyname=s.companyname, t.phone=s.phone, t.[address]=s.[address]  &lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; matched &lt;span class="kwrd"&gt;then&lt;/span&gt; insert (custid, companyname, phone, [address])                           &lt;span class="kwrd"&gt;values&lt;/span&gt;( s.custid,s.companyname, s.phone, s.[address])  &lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; matched &lt;span class="kwrd"&gt;by&lt;/span&gt; source &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;delete&lt;/span&gt;  ;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;得到&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114308352.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114305909.png" width="244" height="104" /&gt;&lt;/a&gt;和&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114312911.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204131114312420.png" width="272" height="135" /&gt;&lt;/a&gt;相比较。 发现1和4没了。&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;好了。 现在回到第一个例子。 这个例子中， 需要更新已经存在的客户和增加不存在的客户。&lt;/p&gt;&lt;p&gt;可是， 在重写现有客户的属性之前， 语句没有检查列值是否真的发生过变化。 也就是说， 即使来源表和目标表完全相同， 仍然要修改客户行。 用and选项能够为不同的操作子句增加谓词条件， 以避免不必要的系统开销。&lt;/p&gt;&lt;div class="csharpcode"&gt;  merge &lt;span class="kwrd"&gt;into&lt;/span&gt; customers &lt;span class="kwrd"&gt;as&lt;/span&gt; t  &lt;span class="kwrd"&gt;using&lt;/span&gt; customersStage &lt;span class="kwrd"&gt;as&lt;/span&gt; s  &lt;span class="kwrd"&gt;on&lt;/span&gt; t.custid=s.custid  &lt;span class="kwrd"&gt;when&lt;/span&gt; matched &lt;span class="kwrd"&gt;and&lt;/span&gt; (      t.companyname&amp;lt;&amp;gt;s.companyname       &lt;span class="kwrd"&gt;or&lt;/span&gt; t.phone&amp;lt;&amp;gt;s.phone       &lt;span class="kwrd"&gt;or&lt;/span&gt; t.[address]&amp;lt;&amp;gt;s.[address]  )  &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;update&lt;/span&gt; &lt;span class="kwrd"&gt;set&lt;/span&gt; t.companyname=s.companyname, t.phone=s.phone, t.[address]=s.[address]  &lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; matched &lt;span class="kwrd"&gt;then&lt;/span&gt; insert (custid, companyname, phone, [address])                           &lt;span class="kwrd"&gt;values&lt;/span&gt;( s.custid,s.companyname, s.phone, s.[address])  &lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; matched &lt;span class="kwrd"&gt;by&lt;/span&gt; source &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;delete&lt;/span&gt;  ;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2445461.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/04/13/2445461.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442573.html</id><title type="text">sql server 2008语言基础: 透视转换</title><summary type="text">USE tempdb;IF OBJECT_ID('dbo.Orders', 'U') IS NOT NULL DROP TABLE dbo.Orders;GOCREATE TABLE dbo.Orders( orderid INT NOT NULL, orderdate DATE NOT NULL, -- prior to SQL Server 2008 use ...</summary><published>2012-04-11T08:27:00Z</published><updated>2012-04-11T08:27:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442573.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442573.html"/><content type="html">&lt;div class="csharpcode"&gt;&lt;span class="kwrd"&gt;USE&lt;/span&gt; tempdb;&amp;nbsp;&lt;span class="kwrd"&gt;IF&lt;/span&gt; OBJECT_ID(&lt;span class="str"&gt;'dbo.Orders'&lt;/span&gt;, &lt;span class="str"&gt;'U'&lt;/span&gt;) &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt; &lt;span class="kwrd"&gt;DROP&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; dbo.Orders;&lt;span class="kwrd"&gt;GO&lt;/span&gt;&amp;nbsp;&lt;span class="kwrd"&gt;CREATE&lt;/span&gt; &lt;span class="kwrd"&gt;TABLE&lt;/span&gt; dbo.Orders(  orderid   &lt;span class="kwrd"&gt;INT&lt;/span&gt;        &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,  orderdate &lt;span class="kwrd"&gt;DATE&lt;/span&gt;       &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;, &lt;span class="rem"&gt;-- prior to SQL Server 2008 use DATETIME&lt;/span&gt;  empid     &lt;span class="kwrd"&gt;INT&lt;/span&gt;        &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,  custid    &lt;span class="kwrd"&gt;VARCHAR&lt;/span&gt;(5) &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,  qty       &lt;span class="kwrd"&gt;INT&lt;/span&gt;        &lt;span class="kwrd"&gt;NOT&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;,  &lt;span class="kwrd"&gt;CONSTRAINT&lt;/span&gt; PK_Orders &lt;span class="kwrd"&gt;PRIMARY&lt;/span&gt; &lt;span class="kwrd"&gt;KEY&lt;/span&gt;(orderid));&amp;nbsp;INSERT &lt;span class="kwrd"&gt;INTO&lt;/span&gt; dbo.Orders(orderid, orderdate, empid, custid, qty)&lt;span class="kwrd"&gt;VALUES&lt;/span&gt;  (30001, &lt;span class="str"&gt;'20070802'&lt;/span&gt;, 3, &lt;span class="str"&gt;'A'&lt;/span&gt;, 10),  (10001, &lt;span class="str"&gt;'20071224'&lt;/span&gt;, 2, &lt;span class="str"&gt;'A'&lt;/span&gt;, 12),  (10005, &lt;span class="str"&gt;'20071224'&lt;/span&gt;, 1, &lt;span class="str"&gt;'B'&lt;/span&gt;, 20),  (40001, &lt;span class="str"&gt;'20080109'&lt;/span&gt;, 2, &lt;span class="str"&gt;'A'&lt;/span&gt;, 40),  (10006, &lt;span class="str"&gt;'20080118'&lt;/span&gt;, 1, &lt;span class="str"&gt;'C'&lt;/span&gt;, 14),  (20001, &lt;span class="str"&gt;'20080212'&lt;/span&gt;, 2, &lt;span class="str"&gt;'B'&lt;/span&gt;, 12),  (40005, &lt;span class="str"&gt;'20090212'&lt;/span&gt;, 3, &lt;span class="str"&gt;'A'&lt;/span&gt;, 10),  (20002, &lt;span class="str"&gt;'20090216'&lt;/span&gt;, 1, &lt;span class="str"&gt;'C'&lt;/span&gt;, 20),  (30003, &lt;span class="str"&gt;'20090418'&lt;/span&gt;, 2, &lt;span class="str"&gt;'B'&lt;/span&gt;, 15),  (30004, &lt;span class="str"&gt;'20070418'&lt;/span&gt;, 3, &lt;span class="str"&gt;'C'&lt;/span&gt;, 22),  (30007, &lt;span class="str"&gt;'20090907'&lt;/span&gt;, 3, &lt;span class="str"&gt;'D'&lt;/span&gt;, 30);&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626348891.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626353743.png" width="244" height="215"&gt;&lt;/a&gt;&lt;div class="csharpcode"&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; empid,custid,&lt;span class="kwrd"&gt;SUM&lt;/span&gt;(qty) SumQty &lt;span class="kwrd"&gt;from&lt;/span&gt; Orders&lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; empid, custid&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;p&gt;得到&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626374167.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626387972.png" width="185" height="153"&gt;&lt;/a&gt;每个员工在每个客户身上一共有多少个产品数量. 看到这个图. 如果我们想得到下面这个图呢&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626396694.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626409693.png" width="502" height="108"&gt;&lt;/a&gt;这就是行转列的问题了.&lt;/p&gt;&lt;p&gt;传统方法.&lt;span class="kwrd"&gt;with&lt;/span&gt; t &lt;span class="kwrd"&gt;as&lt;/span&gt;(&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; empid,custid,&lt;span class="kwrd"&gt;SUM&lt;/span&gt;(qty) SumQty &lt;span class="kwrd"&gt;from&lt;/span&gt; Orders&lt;br/&gt;&lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; empid, custid&lt;br/&gt;)&lt;br/&gt;----传统方法.&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; empid,&lt;br/&gt;&lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="kwrd"&gt;when&lt;/span&gt; custid=&lt;span class="str"&gt;'A'&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; qty &lt;span class="kwrd"&gt;else&lt;/span&gt; 0 &lt;span class="kwrd"&gt;end&lt;/span&gt;) A,&lt;br/&gt;&lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="kwrd"&gt;when&lt;/span&gt; custid=&lt;span class="str"&gt;'B'&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; qty &lt;span class="kwrd"&gt;else&lt;/span&gt; 0 &lt;span class="kwrd"&gt;end&lt;/span&gt;) B,&lt;br/&gt;&lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="kwrd"&gt;when&lt;/span&gt; custid=&lt;span class="str"&gt;'C'&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; qty &lt;span class="kwrd"&gt;else&lt;/span&gt; 0 &lt;span class="kwrd"&gt;end&lt;/span&gt;) C,&lt;br/&gt;&lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="kwrd"&gt;when&lt;/span&gt; custid=&lt;span class="str"&gt;'D'&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; qty &lt;span class="kwrd"&gt;else&lt;/span&gt; 0 &lt;span class="kwrd"&gt;end&lt;/span&gt;) D&lt;br/&gt; &lt;span class="kwrd"&gt;from&lt;/span&gt; Orders &lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; empid&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;pivot透视法.&lt;/p&gt;&lt;p&gt;--pivot运算符. 也是在查询的from子句的上下文中执行操作. 它对某个源表或者表表达式进行操作, 透视数据. &lt;br&gt;--再返回一个结果表.&amp;nbsp; &lt;strong&gt;三个步骤, 分组, 扩展, 聚合&lt;/strong&gt;.&lt;br&gt;--在pivot运算符的&lt;strong&gt;圆括号内要指定聚合函数(本例为sum), 聚合元素(qty), 扩展元素(custid),&lt;/strong&gt; &lt;br&gt;--以及目标列名称的列表. 在pivot运算符的圆括号后面, 可以为结果表指定一个别名.&lt;br&gt;&lt;/p&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; empid, A,B,C,D,e &lt;span class="kwrd"&gt;from&lt;/span&gt; &lt;br/&gt;( &lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; empid,custid, qty &lt;span class="kwrd"&gt;from&lt;/span&gt; Orders&lt;br/&gt;) &lt;span class="kwrd"&gt;as&lt;/span&gt; t &lt;br/&gt;pivot(&lt;span class="kwrd"&gt;sum&lt;/span&gt;(qty) &lt;span class="kwrd"&gt;for&lt;/span&gt; custid &lt;span class="kwrd"&gt;in&lt;/span&gt;(A,B,C,D,e))&lt;br/&gt;&lt;span class="kwrd"&gt;as&lt;/span&gt; p;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;这时候, 我们可能会问. &lt;span class="kwrd"&gt;select&lt;/span&gt; empid, A,B,C,D,e &lt;span class="kwrd"&gt;from&lt;/span&gt; &lt;br/&gt;Orders&lt;br/&gt;pivot(&lt;span class="kwrd"&gt;sum&lt;/span&gt;(qty) &lt;span class="kwrd"&gt;for&lt;/span&gt; custid &lt;span class="kwrd"&gt;in&lt;/span&gt;(A,B,C,D,e))&lt;br/&gt;&lt;span class="kwrd"&gt;as&lt;/span&gt; p;&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;这样写行不行呢?&lt;/p&gt;&lt;p&gt;我们来运行一下. 得到&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626401296.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626412658.png" width="244" height="186"&gt;&lt;/a&gt;. 并没有按empid分组.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626418655.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626433855.png" width="618" height="516"&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;可以这么理解. 如果直接用order表作为源表. 那么直接就用order表的每一行进行分组. 得到的自然是最小粒度的行.&lt;/p&gt;&lt;p&gt;而&lt;/p&gt;&lt;p&gt;( &lt;span class="kwrd"&gt;select&lt;/span&gt; empid,custid, qty &lt;span class="kwrd"&gt;from&lt;/span&gt; Orders ) &lt;span class="kwrd"&gt;as&lt;/span&gt; t&amp;nbsp; 作为源表. 那么就是用empid, custid, qty三列有资格作为分组列.&lt;/p&gt;&lt;p&gt;可是在下文的代码里. custid成为了扩展列. qty成为了聚合列. 那么还有一个分组列呢. 自然就是empid了.&lt;/p&gt;&lt;p&gt;于是. 就达到了目标.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;练习&lt;/p&gt;&lt;div class="csharpcode"&gt;/* 普通行列转换 (爱新觉罗.毓华 2007-11-18于海南三亚) 假设有张学生成绩表(tb)如下: Name Subject &lt;span class="kwrd"&gt;Result&lt;/span&gt; 张三 语文74 张三 数学83 张三 物理93 李四 语文74 李四 数学84 李四 物理94 */ -----------------------------------------------------------------------&lt;span class="rem"&gt;--&lt;/span&gt; /* 想变成  姓名         语文        数学        物理           --------&lt;span class="rem"&gt;-- ----------- ----------- ----------- &lt;/span&gt; 李四         74          84          94 张三         74          83          93 */ &lt;span class="kwrd"&gt;create&lt;/span&gt; &lt;span class="kwrd"&gt;table&lt;/span&gt; tb (    Name    &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(10) ,    Subject &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(10) ,    &lt;span class="kwrd"&gt;Result&lt;/span&gt;  &lt;span class="kwrd"&gt;int&lt;/span&gt; ) insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tb(Name , Subject , &lt;span class="kwrd"&gt;Result&lt;/span&gt;) &lt;span class="kwrd"&gt;values&lt;/span&gt;(&lt;span class="str"&gt;'张三'&lt;/span&gt; , &lt;span class="str"&gt;'语文'&lt;/span&gt; , 74) insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tb(Name , Subject , &lt;span class="kwrd"&gt;Result&lt;/span&gt;) &lt;span class="kwrd"&gt;values&lt;/span&gt;(&lt;span class="str"&gt;'张三'&lt;/span&gt; , &lt;span class="str"&gt;'数学'&lt;/span&gt; , 83) insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tb(Name , Subject , &lt;span class="kwrd"&gt;Result&lt;/span&gt;) &lt;span class="kwrd"&gt;values&lt;/span&gt;(&lt;span class="str"&gt;'张三'&lt;/span&gt; , &lt;span class="str"&gt;'物理'&lt;/span&gt; , 93) insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tb(Name , Subject , &lt;span class="kwrd"&gt;Result&lt;/span&gt;) &lt;span class="kwrd"&gt;values&lt;/span&gt;(&lt;span class="str"&gt;'李四'&lt;/span&gt; , &lt;span class="str"&gt;'语文'&lt;/span&gt; , 74) insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tb(Name , Subject , &lt;span class="kwrd"&gt;Result&lt;/span&gt;) &lt;span class="kwrd"&gt;values&lt;/span&gt;(&lt;span class="str"&gt;'李四'&lt;/span&gt; , &lt;span class="str"&gt;'数学'&lt;/span&gt; , 84) insert &lt;span class="kwrd"&gt;into&lt;/span&gt; tb(Name , Subject , &lt;span class="kwrd"&gt;Result&lt;/span&gt;) &lt;span class="kwrd"&gt;values&lt;/span&gt;(&lt;span class="str"&gt;'李四'&lt;/span&gt; , &lt;span class="str"&gt;'物理'&lt;/span&gt; , 94) &lt;span class="kwrd"&gt;go&lt;/span&gt; --静态SQL,指subject只有语文、数学、物理这三门课程。 &lt;span class="kwrd"&gt;select&lt;/span&gt; name 姓名,   &lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;case&lt;/span&gt; subject &lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="str"&gt;'语文'&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;result&lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt; 0 &lt;span class="kwrd"&gt;end&lt;/span&gt;) 语文,   &lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;case&lt;/span&gt; subject &lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="str"&gt;'数学'&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;result&lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt; 0 &lt;span class="kwrd"&gt;end&lt;/span&gt;) 数学,   &lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;case&lt;/span&gt; subject &lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="str"&gt;'物理'&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;result&lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt; 0 &lt;span class="kwrd"&gt;end&lt;/span&gt;) 物理 &lt;span class="kwrd"&gt;from&lt;/span&gt; tb &lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; name /* 姓名         语文        数学        物理           --------&lt;span class="rem"&gt;-- ----------- ----------- ----------- &lt;/span&gt; 李四         74          84          94 张三         74          83          93 */ 首先写出pivot源表的表表达式.select name,result, [subject] from tb. 其中 name是分组列, result是聚合列. subject是扩展列.&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204111626436331.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/20120411162643965.png" width="454" height="70"&gt;&lt;/a&gt;pivot(语法) as 临时表明.完成最后的select:  select name , 语文,数学,物理..  得到&lt;span class="kwrd"&gt;select&lt;/span&gt; name , 语文,数学,物理&lt;br/&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt;(&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; name,&lt;span class="kwrd"&gt;result&lt;/span&gt;, [subject] &lt;span class="kwrd"&gt;from&lt;/span&gt; tb&lt;br/&gt;) z pivot(&lt;span class="kwrd"&gt;max&lt;/span&gt;(&lt;span class="kwrd"&gt;result&lt;/span&gt;) &lt;span class="kwrd"&gt;for&lt;/span&gt; [subject] &lt;span class="kwrd"&gt;in&lt;/span&gt; (语文,数学,物理)) &lt;span class="kwrd"&gt;as&lt;/span&gt; p&lt;br/&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&amp;nbsp;&lt;/div&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2442573.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442573.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442200.html</id><title type="text">sql server 2008语言基础: 集合</title><summary type="text">--declare @t table(n int)--insert into @t values(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)--select * from @t --返回在2008年1月有订单活动, 而在08年2月没有订单活动的客户和雇员.--select custid, empid from Sales.Orders where orderdat...</summary><published>2012-04-11T05:28:00Z</published><updated>2012-04-11T05:28:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442200.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442200.html"/><content type="html">--&lt;span class="kwrd"&gt;declare&lt;/span&gt; @t &lt;span class="kwrd"&gt;table&lt;/span&gt;(n &lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;br/&gt;--insert &lt;span class="kwrd"&gt;into&lt;/span&gt; @t &lt;span class="kwrd"&gt;values&lt;/span&gt;(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; @t &lt;br/&gt;&lt;br/&gt;--返回在2008年1月有订单活动, 而在08年2月没有订单活动的客户和雇员.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2008-01-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-02-01'&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;except&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2008-02-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-03-01'&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;--返回在08年1月和2月都有订单活动的客户和雇员&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2008-01-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-02-01'&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;intersect&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2008-02-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-03-01'&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;--在08年1月和2月有, 在07年没有的客户和雇员&lt;br/&gt;--(&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2008-01-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-02-01'&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;intersect&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2008-02-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-03-01'&lt;/span&gt;&lt;br/&gt;--)&lt;br/&gt;--&lt;span class="kwrd"&gt;except&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2007-1-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-01-01'&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; country,region,city &lt;span class="kwrd"&gt;from&lt;/span&gt; hr.Employees&lt;br/&gt;&lt;span class="kwrd"&gt;union&lt;/span&gt; &lt;span class="kwrd"&gt;all&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; country,region,city &lt;span class="kwrd"&gt;from&lt;/span&gt; Production.Suppliers&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2442200.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/04/11/2442200.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/04/10/2440534.html</id><title type="text">sql server 2008语言基础: 表表达式</title><summary type="text">--返回每个雇员处理过的订单的最近日期.--select empid, max(orderdate) as maxOrderDate from Sales.Orders group by empid--封装上面的结果集, 并和order表连接, 为每个雇员返回其订单日期最近的订单信息./*with t as (select empid, max(orderdate) as maxOrderDate...</summary><published>2012-04-10T06:29:00Z</published><updated>2012-04-10T06:29:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/04/10/2440534.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/04/10/2440534.html"/><content type="html">--返回每个雇员处理过的订单的最近日期.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; empid, &lt;span class="kwrd"&gt;max&lt;/span&gt;(orderdate) &lt;span class="kwrd"&gt;as&lt;/span&gt; maxOrderDate &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; empid&lt;br/&gt;--封装上面的结果集, 并和order表连接, 为每个雇员返回其订单日期最近的订单信息.&lt;br/&gt;/*&lt;br/&gt;&lt;span class="kwrd"&gt;with&lt;/span&gt; t &lt;span class="kwrd"&gt;as&lt;/span&gt; (&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; empid, &lt;span class="kwrd"&gt;max&lt;/span&gt;(orderdate) &lt;span class="kwrd"&gt;as&lt;/span&gt; maxOrderDate &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; empid&lt;br/&gt;)&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; t.empid, t.maxOrderDate, o.orderid, o.custid &lt;br/&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt; t &lt;span class="kwrd"&gt;inner&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;on&lt;/span&gt; t.empid=o.empid &lt;span class="kwrd"&gt;and&lt;/span&gt; o.orderdate=t.maxOrderDate&lt;br/&gt;*/&lt;br/&gt;--为每个订单按照orderdate, orderid的顺序来计算其行号.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; orderid, orderdate, custid, empid, ROW_NUMBER() &lt;span class="kwrd"&gt;over&lt;/span&gt;(&lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; orderdate, orderid) rownum &lt;br/&gt;--&lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders&lt;br/&gt;/*&lt;br/&gt;&lt;span class="kwrd"&gt;with&lt;/span&gt; T &lt;span class="kwrd"&gt;as&lt;/span&gt; (&lt;br/&gt;    &lt;span class="kwrd"&gt;select&lt;/span&gt; orderid, orderdate, custid, empid, ROW_NUMBER() &lt;span class="kwrd"&gt;over&lt;/span&gt;(&lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; orderdate, orderid) rownum &lt;br/&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders&lt;br/&gt;)&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; T &lt;span class="kwrd"&gt;where&lt;/span&gt; rownum&amp;gt;10 &lt;span class="kwrd"&gt;and&lt;/span&gt; rownum&amp;lt;=20&lt;br/&gt;*/&lt;br/&gt;&lt;br/&gt;--使用cte递归来设计一个解决方案, 返回领导id为9 的管理链.&lt;br/&gt;/*&lt;br/&gt;&lt;span class="kwrd"&gt;with&lt;/span&gt; t &lt;span class="kwrd"&gt;as&lt;/span&gt; (&lt;br/&gt;    &lt;span class="kwrd"&gt;select&lt;/span&gt; empid,mgrid,firstname,lastname &lt;span class="kwrd"&gt;from&lt;/span&gt; hr.Employees &lt;span class="kwrd"&gt;where&lt;/span&gt; empid=9&lt;br/&gt;    &lt;span class="kwrd"&gt;union&lt;/span&gt; &lt;span class="kwrd"&gt;all&lt;/span&gt;&lt;br/&gt;    &lt;span class="kwrd"&gt;select&lt;/span&gt; e.empid,e.mgrid,e.firstname,e.lastname &lt;span class="kwrd"&gt;from&lt;/span&gt; hr.Employees e &lt;span class="kwrd"&gt;inner&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; t &lt;span class="kwrd"&gt;on&lt;/span&gt; e.empid=t.mgrid&lt;br/&gt;)&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; t&lt;br/&gt;*/&lt;br/&gt;&lt;br/&gt;--返回每个雇员每年处理的总订货量&lt;br/&gt;/*&lt;br/&gt;&lt;span class="kwrd"&gt;create&lt;/span&gt; &lt;span class="kwrd"&gt;VIEW&lt;/span&gt; [dbo].[V_1]&lt;br/&gt;&lt;span class="kwrd"&gt;AS&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt;     &lt;span class="kwrd"&gt;TOP&lt;/span&gt; (100) &lt;span class="kwrd"&gt;PERCENT&lt;/span&gt; Sales.Orders.empid, &lt;span class="kwrd"&gt;YEAR&lt;/span&gt;(Sales.Orders.orderdate) &lt;span class="kwrd"&gt;AS&lt;/span&gt; orderYear, &lt;span class="kwrd"&gt;SUM&lt;/span&gt;(Sales.OrderDetails.qty) &lt;span class="kwrd"&gt;AS&lt;/span&gt; totalQty&lt;br/&gt;&lt;span class="kwrd"&gt;FROM&lt;/span&gt;         Sales.OrderDetails &lt;span class="kwrd"&gt;INNER&lt;/span&gt; &lt;span class="kwrd"&gt;JOIN&lt;/span&gt;&lt;br/&gt;                      Sales.Orders &lt;span class="kwrd"&gt;ON&lt;/span&gt; Sales.OrderDetails.orderid = Sales.Orders.orderid&lt;br/&gt;&lt;span class="kwrd"&gt;GROUP&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; Sales.Orders.empid, &lt;span class="kwrd"&gt;YEAR&lt;/span&gt;(Sales.Orders.orderdate)&lt;br/&gt;&lt;span class="kwrd"&gt;ORDER&lt;/span&gt; &lt;span class="kwrd"&gt;BY&lt;/span&gt; Sales.Orders.empid, orderYear&lt;br/&gt;*/&lt;br/&gt;--使用上面这个视图, 返回每个雇员每年处理过的连续总订货量&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; *,(&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="kwrd"&gt;SUM&lt;/span&gt;(totalQty) &lt;span class="kwrd"&gt;from&lt;/span&gt; V_1 v1 &lt;span class="kwrd"&gt;where&lt;/span&gt; v1.empid=v2.empid &lt;span class="kwrd"&gt;and&lt;/span&gt; v1.orderyear&amp;lt;=v2.orderyear) &lt;span class="kwrd"&gt;from&lt;/span&gt; dbo.V_1 v2&lt;br/&gt;&lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; empid,orderyear&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2440534.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/04/10/2440534.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/04/09/2439154.html</id><title type="text">sql server 2008语言基础: 子查询习题</title><summary type="text">独立子查询 独立标量子查询 相关子查询 not in () 的null值处理. --返回由拥有订单数目最多的客户下过的所有订单. 注意, 多个客户可能下过的订单数目是一样的--因此用到了with ties子句--select o.custid, o.orderid, o.orderdate, o.empid from Sales.Orders o wh...</summary><published>2012-04-09T08:30:00Z</published><updated>2012-04-09T08:30:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/04/09/2439154.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/04/09/2439154.html"/><content type="html">&lt;p&gt;独立子查询&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;font color="#111111"&gt;独立标量子查询&lt;/font&gt;&lt;/p&gt;    &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204091630105150.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204091630104769.png" width="421" height="42" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;相关子查询&lt;/p&gt;  &lt;blockquote style='border:2px solid #EFEFEF;color:#333333;padding:5px 10px;'&gt;   &lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204091630119163.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201204/201204091630117493.png" width="456" height="74" /&gt;&lt;/a&gt;&lt;/p&gt; &lt;/blockquote&gt;    &lt;p&gt;not in () 的null值处理.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  --返回由拥有订单数目最多的客户下过的所有订单. 注意, 多个客户可能下过的订单数目是一样的&lt;br/&gt;--因此用到了with ties子句&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; o.custid, o.orderid, o.orderdate, o.empid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;where&lt;/span&gt; custid &lt;span class="kwrd"&gt;in&lt;/span&gt;&lt;br/&gt;--(&lt;br/&gt;&lt;span class="rem"&gt;--    select top 1 with ties custid from Sales.Orders group by custid order by COUNT(*) desc&lt;/span&gt;&lt;br/&gt;--)&lt;br/&gt;&lt;br/&gt;--返回&lt;span class="str"&gt;'2008-05-01'&lt;/span&gt;之后就没有处理过订单的员工&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; HR.Employees e&lt;br/&gt;--&lt;span class="kwrd"&gt;where&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; &lt;span class="kwrd"&gt;exists&lt;/span&gt;(&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2008-05-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; o.empid=e.empid)&lt;br/&gt;&lt;br/&gt;--返回在客户表中出现过, 但是没有在员工表中出现过的国家&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="kwrd"&gt;distinct&lt;/span&gt; country &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Customers &lt;span class="kwrd"&gt;where&lt;/span&gt; country &lt;span class="kwrd"&gt;not&lt;/span&gt; &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;br/&gt;--(&lt;span class="kwrd"&gt;select&lt;/span&gt; country &lt;span class="kwrd"&gt;from&lt;/span&gt; hr.Employees &lt;span class="kwrd"&gt;where&lt;/span&gt; country &lt;span class="kwrd"&gt;is&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;--为每个客户返回在他参加活动的最后一天下过的所有订单.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;inner&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; &lt;br/&gt;--(&lt;br/&gt;&lt;span class="rem"&gt;--    select max(orderdate) dt, custid from Sales.Orders group by custid&lt;/span&gt;&lt;br/&gt;--) t &lt;span class="kwrd"&gt;on&lt;/span&gt; o.custid=t.custid &lt;span class="kwrd"&gt;and&lt;/span&gt; o.orderdate=t.dt&lt;br/&gt;&lt;br/&gt;--返回2007年下过订单, 但是08年没有下过订单的客户&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;where&lt;/span&gt; &lt;span class="kwrd"&gt;YEAR&lt;/span&gt;(orderdate)=2007&lt;br/&gt;--&lt;span class="kwrd"&gt;and&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; &lt;span class="kwrd"&gt;exists&lt;/span&gt;(&lt;span class="kwrd"&gt;select&lt;/span&gt; custid &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o2 &lt;span class="kwrd"&gt;where&lt;/span&gt; o.custid=o2.custid &lt;span class="kwrd"&gt;and&lt;/span&gt; &lt;span class="kwrd"&gt;YEAR&lt;/span&gt;(orderdate)=2008)&lt;br/&gt;&lt;br/&gt;--返回订购了第12号产品的客户.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="kwrd"&gt;distinct&lt;/span&gt; c.custid,companyname &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;inner&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; Sales.OrderDetails od &lt;span class="kwrd"&gt;on&lt;/span&gt; o.orderid=od.orderid&lt;br/&gt;--&lt;span class="kwrd"&gt;inner&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; Sales.Customers c &lt;span class="kwrd"&gt;on&lt;/span&gt; o.custid=c.custid &lt;span class="kwrd"&gt;where&lt;/span&gt; od.productid=12&lt;br/&gt;&lt;br/&gt;--计算每个客户在每个月的连续总订货量&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; c.custid,c.ordermonth,c.qty,&lt;br/&gt;(&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="kwrd"&gt;SUM&lt;/span&gt;(qty) &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.CustOrders co2 &lt;span class="kwrd"&gt;where&lt;/span&gt; co2.ordermonth&amp;lt;=c.ordermonth&lt;br/&gt;    &lt;span class="kwrd"&gt;and&lt;/span&gt; co2.custid=c.custid&lt;br/&gt;) &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.CustOrders c &lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; custid&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2439154.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/04/09/2439154.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/04/09/2438626.html</id><title type="text">sql server 2008语言基础: 连接查询习题</title><summary type="text">declare @t table(n int)declare @i int=1while(@i&lt;1000)begin insert into @t select @i set @i=@i+1end--select * from @t--1. copy all employees five times.--select e.empid,e.firstname,e.lastname, t....</summary><published>2012-04-09T03:15:00Z</published><updated>2012-04-09T03:15:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/04/09/2438626.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/04/09/2438626.html"/><content type="html">&lt;span class="kwrd"&gt;declare&lt;/span&gt; @t &lt;span class="kwrd"&gt;table&lt;/span&gt;(n &lt;span class="kwrd"&gt;int&lt;/span&gt;)&lt;br/&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @i &lt;span class="kwrd"&gt;int&lt;/span&gt;=1&lt;br/&gt;&lt;span class="kwrd"&gt;while&lt;/span&gt;(@i&amp;lt;1000)&lt;br/&gt;&lt;span class="kwrd"&gt;begin&lt;/span&gt;&lt;br/&gt;    insert &lt;span class="kwrd"&gt;into&lt;/span&gt; @t &lt;span class="kwrd"&gt;select&lt;/span&gt; @i&lt;br/&gt;    &lt;span class="kwrd"&gt;set&lt;/span&gt; @i=@i+1&lt;br/&gt;&lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; @t&lt;br/&gt;&lt;br/&gt;--1. copy &lt;span class="kwrd"&gt;all&lt;/span&gt; employees five times.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; e.empid,e.firstname,e.lastname, t.n &lt;span class="kwrd"&gt;from&lt;/span&gt; hr.Employees e, @t t &lt;span class="kwrd"&gt;where&lt;/span&gt; t.n&amp;lt;6&lt;br/&gt;&lt;br/&gt;--2. 为每个雇员和从09年6月12日至09年6月16日范围内的每天返回一行.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; e.empid,e.firstname,e.lastname,DATEADD(&lt;span class="kwrd"&gt;day&lt;/span&gt;, t.n,&lt;span class="str"&gt;'2009-06-12'&lt;/span&gt;) &lt;span class="kwrd"&gt;from&lt;/span&gt; hr.Employees e, @t t &lt;br/&gt;--&lt;span class="kwrd"&gt;where&lt;/span&gt; t.n&amp;lt;6 &lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; empid&lt;br/&gt;&lt;br/&gt;--3. 返回来自美国的客户, 并为每个客户返回其订单总数和商品交易总数量&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; c.custid, &lt;span class="kwrd"&gt;count&lt;/span&gt;(o.orderid), &lt;span class="kwrd"&gt;sum&lt;/span&gt;(od.qty) &lt;span class="kwrd"&gt;from&lt;/span&gt; &lt;br/&gt;--Sales.Customers c , Sales.Orders o, Sales.OrderDetails od&lt;br/&gt;--&lt;span class="kwrd"&gt;where&lt;/span&gt; c.country=&lt;span class="str"&gt;'usa'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; c.custid=o.custid &lt;span class="kwrd"&gt;and&lt;/span&gt; o.orderid=od.orderid &lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; c.custid&lt;br/&gt;&lt;br/&gt;--4. 返回客户及其订单信息,  包括没有下过任何订单的客户.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; c.custid,c.companyname, o.orderid, o.orderdate &lt;br/&gt;--&lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Customers c &lt;span class="kwrd"&gt;left&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;on&lt;/span&gt; c.custid=o.custid&lt;br/&gt;&lt;br/&gt;--4. 返回没有下过订单的客户&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; c.custid,c.companyname, o.orderid, o.orderdate &lt;br/&gt;--&lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;right&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt;  Sales.Customers c &lt;span class="kwrd"&gt;on&lt;/span&gt; c.custid=o.custid &lt;span class="kwrd"&gt;where&lt;/span&gt; o.orderid &lt;span class="kwrd"&gt;is&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;--5. 返回在07年2月12日下过订单的客户, 以及他们的订单&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; c.custid,c.companyname, o.orderid, o.orderdate &lt;br/&gt;--&lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;right&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt;  Sales.Customers c &lt;span class="kwrd"&gt;on&lt;/span&gt; c.custid=o.custid &lt;br/&gt;--&lt;span class="kwrd"&gt;where&lt;/span&gt; o.orderdate=&lt;span class="str"&gt;'2007-02-12'&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;--6. 返回在2007年2月12日下过订单的客户, 以及他们的订单. 也返回在2007年2月12日没有下过订单的客户&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; c.custid,c.companyname, &lt;br/&gt;&lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="kwrd"&gt;when&lt;/span&gt; o.orderid &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="str"&gt;'no'&lt;/span&gt; &lt;span class="kwrd"&gt;else&lt;/span&gt;  &lt;span class="str"&gt;'yes'&lt;/span&gt; &lt;span class="kwrd"&gt;end&lt;/span&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders o &lt;span class="kwrd"&gt;right&lt;/span&gt; &lt;span class="kwrd"&gt;join&lt;/span&gt;  Sales.Customers c &lt;span class="kwrd"&gt;on&lt;/span&gt; &lt;br/&gt;(c.custid=o.custid &lt;span class="kwrd"&gt;and&lt;/span&gt; o.orderdate=&lt;span class="str"&gt;'2007-02-12'&lt;/span&gt;)&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2438626.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/04/09/2438626.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/03/31/2427488.html</id><title type="text">sql server 2008语言基础: T-sql语言基础2简单技巧</title><summary type="text">--select * from Sales.Orders --where orderdate&gt;='2007-06-01' and orderdate&lt;'2007-07-01'--获得每个月的最后一天, 原理. 随意取一个有31天的月. 比如1月31--然后加上一个月, 得到2月31. 实际上不存在这天, 应该是2月28或者29. --select DATEADD(MONTH, 1, '2012-0...</summary><published>2012-03-31T10:14:00Z</published><updated>2012-03-31T10:14:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/03/31/2427488.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/03/31/2427488.html"/><content type="html">--&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Orders &lt;br/&gt;--&lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2007-06-01'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2007-07-01'&lt;/span&gt;&lt;br/&gt;--获得每个月的最后一天, 原理. 随意取一个有31天的月. 比如1月31&lt;br/&gt;--然后加上一个月, 得到2月31. 实际上不存在这天, 应该是2月28或者29. &lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; DATEADD(&lt;span class="kwrd"&gt;MONTH&lt;/span&gt;, 1, &lt;span class="str"&gt;'2012-03-31'&lt;/span&gt;)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;--返回姓氏里面包含字母a两次或者更多次数的雇员.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; hr.Employees &lt;span class="kwrd"&gt;where&lt;/span&gt; lastname &lt;span class="kwrd"&gt;like&lt;/span&gt; &lt;span class="str"&gt;'%a%a%'&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;--返回总价格(数量乘以单价)大于10000的订单.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; orderid, &lt;span class="kwrd"&gt;sum&lt;/span&gt;(qty*unitprice) &lt;span class="kwrd"&gt;from&lt;/span&gt; sales.OrderDetails &lt;br/&gt;--&lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; orderid &lt;span class="kwrd"&gt;having&lt;/span&gt; &lt;span class="kwrd"&gt;sum&lt;/span&gt;(qty*unitprice)&amp;gt;10000&lt;br/&gt;&lt;br/&gt;--返回2007年平均运费最高的三个发货国家&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; &lt;span class="kwrd"&gt;top&lt;/span&gt; 3 shipcountry, &lt;span class="kwrd"&gt;AVG&lt;/span&gt;(freight) &lt;span class="kwrd"&gt;from&lt;/span&gt; sales.Orders &lt;br/&gt;--&lt;span class="kwrd"&gt;where&lt;/span&gt; orderdate&amp;gt;=&lt;span class="str"&gt;'2007-1-1'&lt;/span&gt; &lt;span class="kwrd"&gt;and&lt;/span&gt; orderdate&amp;lt;&lt;span class="str"&gt;'2008-1-1'&lt;/span&gt;&lt;br/&gt;--&lt;span class="kwrd"&gt;group&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; shipcountry &lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; &lt;span class="kwrd"&gt;AVG&lt;/span&gt;(freight) &lt;span class="kwrd"&gt;desc&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;--为每个顾客单独根据订单日期的顺序(用orderid作为附加属性)来计算其订单的行号.&lt;br/&gt;--&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, orderdate, orderid, &lt;br/&gt;--ROW_NUMBER() &lt;span class="kwrd"&gt;over&lt;/span&gt;(partition &lt;span class="kwrd"&gt;by&lt;/span&gt; custid &lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; orderdate) &lt;br/&gt;--&lt;span class="kwrd"&gt;from&lt;/span&gt; sales.Orders &lt;br/&gt;&lt;br/&gt;--排序. 空值null必须排在所有有值的数据之后. 默认是在所有之前的.&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; custid, region &lt;span class="kwrd"&gt;from&lt;/span&gt; Sales.Customers&lt;br/&gt;&lt;span class="kwrd"&gt;order&lt;/span&gt; &lt;span class="kwrd"&gt;by&lt;/span&gt; &lt;span class="kwrd"&gt;case&lt;/span&gt; &lt;span class="kwrd"&gt;when&lt;/span&gt; region &lt;span class="kwrd"&gt;is&lt;/span&gt; &lt;span class="kwrd"&gt;null&lt;/span&gt; &lt;span class="kwrd"&gt;then&lt;/span&gt; 1 &lt;span class="kwrd"&gt;else&lt;/span&gt;  0 &lt;span class="kwrd"&gt;end&lt;/span&gt;, region&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2427488.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/03/31/2427488.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry><entry><id>http://www.cnblogs.com/jianjialin/archive/2012/03/23/2413573.html</id><title type="text">Sql 2008的merge关键字</title><summary type="text">测试数据 /*目标表和源表*/declare @target table(id int, de varchar(50))declare @source table(id int, de varchar(50))insert into @source values (1,'源1'),(2,'源2'),(3,'源3'),(4,'源4')insert into @target values (1,'...</summary><published>2012-03-23T06:06:00Z</published><updated>2012-03-23T06:06:00Z</updated><author><name>MyCoolDog</name><uri>http://www.cnblogs.com/jianjialin/</uri></author><link rel="alternate" href="http://www.cnblogs.com/jianjialin/archive/2012/03/23/2413573.html"/><link rel="alternate" type="text/html" href="http://www.cnblogs.com/jianjialin/archive/2012/03/23/2413573.html"/><content type="html">&lt;p&gt;测试数据   /*目标表和源表*/&lt;br/&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @target &lt;span class="kwrd"&gt;table&lt;/span&gt;(id &lt;span class="kwrd"&gt;int&lt;/span&gt;, de &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(50))&lt;br/&gt;&lt;span class="kwrd"&gt;declare&lt;/span&gt; @source &lt;span class="kwrd"&gt;table&lt;/span&gt;(id &lt;span class="kwrd"&gt;int&lt;/span&gt;, de &lt;span class="kwrd"&gt;varchar&lt;/span&gt;(50))&lt;br/&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; @source &lt;span class="kwrd"&gt;values&lt;/span&gt; (1,&lt;span class="str"&gt;'源1'&lt;/span&gt;),(2,&lt;span class="str"&gt;'源2'&lt;/span&gt;),(3,&lt;span class="str"&gt;'源3'&lt;/span&gt;),(4,&lt;span class="str"&gt;'源4'&lt;/span&gt;)&lt;br/&gt;insert &lt;span class="kwrd"&gt;into&lt;/span&gt; @target &lt;span class="kwrd"&gt;values&lt;/span&gt; &lt;br/&gt;(1,&lt;span class="str"&gt;'在源表里面有1'&lt;/span&gt;),(2,&lt;span class="str"&gt;'在源表里面有2'&lt;/span&gt;),(5,&lt;span class="str"&gt;'在源表里面没有5'&lt;/span&gt;),(6,&lt;span class="str"&gt;'在源表里面没有6'&lt;/span&gt;)&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; @target  &lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406005769.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406009640.png" width="126" height="72" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;代码一  merge &lt;span class="kwrd"&gt;into&lt;/span&gt; @target &lt;span class="kwrd"&gt;as&lt;/span&gt; T&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; @source &lt;span class="kwrd"&gt;as&lt;/span&gt; S &lt;span class="kwrd"&gt;on&lt;/span&gt; T.id=S.id&lt;br/&gt;&lt;span class="kwrd"&gt;when&lt;/span&gt; matched &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;update&lt;/span&gt; &lt;span class="kwrd"&gt;set&lt;/span&gt; T.de=S.de&lt;br/&gt;;&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; @target  &lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;&lt;p&gt;两张表通过id匹配. 如果符合. 则把目标表的de改为源表的de得到数据如&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406001799.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406016127.png" width="174" height="101" /&gt;&lt;/a&gt;. 红圈两列完成了 更改&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;代码二.&lt;/p&gt;merge &lt;span class="kwrd"&gt;into&lt;/span&gt; @target &lt;span class="kwrd"&gt;as&lt;/span&gt; T&lt;br/&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; @source &lt;span class="kwrd"&gt;as&lt;/span&gt; S &lt;span class="kwrd"&gt;on&lt;/span&gt; T.id=S.id&lt;br/&gt;&lt;br/&gt;&lt;span class="kwrd"&gt;when&lt;/span&gt; matched        &lt;span class="kwrd"&gt;then&lt;/span&gt; &lt;span class="kwrd"&gt;update&lt;/span&gt; &lt;span class="kwrd"&gt;set&lt;/span&gt; T.de=S.de&lt;br/&gt;&lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; matched    &lt;span class="kwrd"&gt;then&lt;/span&gt; insert &lt;span class="kwrd"&gt;values&lt;/span&gt;(S.id,S.de)        --如果目标表里面没有源表的数据&lt;br/&gt;/*&lt;span class="kwrd"&gt;when&lt;/span&gt; &lt;span class="kwrd"&gt;not&lt;/span&gt; matched &lt;span class="kwrd"&gt;by&lt;/span&gt; source&lt;br/&gt;&lt;span class="rem"&gt;--                    then delete                            &lt;/span&gt;&lt;br/&gt;--如果target里面有, 但是源表没有的就删除. 有点类似于inner join的笛卡尔乘积, &lt;br/&gt;--左边表里面存着记录, 但是右边表没有. 还是删除掉&lt;br/&gt;*/&lt;br/&gt;&lt;span class="kwrd"&gt;output&lt;/span&gt; $&lt;span class="kwrd"&gt;Action&lt;/span&gt; &lt;span class="kwrd"&gt;as&lt;/span&gt; actiontype,deleted.*,inserted.*&lt;br/&gt;;&lt;br/&gt;&lt;span class="kwrd"&gt;select&lt;/span&gt; * &lt;span class="kwrd"&gt;from&lt;/span&gt; @target&lt;p&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;style type="text/css"&gt;.csharpcode, .csharpcode pre{font-size: small;color: black;font-family: consolas, "Courier New", courier, monospace;background-color: #ffffff;/*white-space: pre;*/}.csharpcode pre { margin: 0em; }.csharpcode .rem { color: #008000; }.csharpcode .kwrd { color: #0000ff; }.csharpcode .str { color: #006080; }.csharpcode .op { color: #0000c0; }.csharpcode .preproc { color: #cc6633; }.csharpcode .asp { background-color: #ffff00; }.csharpcode .html { color: #800000; }.csharpcode .attr { color: #ff0000; }.csharpcode .alt {background-color: #f4f4f4;width: 100%;margin: 0em;}.csharpcode .lnum { color: #606060; }&lt;/style&gt;同样是通过id匹配. 如果符合. 那么更新, 不符合那么插入. &lt;/p&gt;&lt;p&gt;output是输出. $action是表示这次操作的类型. (insert或者update还有delete). 操作类似于触发器. 能够访问到deleted.*表和inserted.*表的东西.&lt;/p&gt;&lt;p&gt;因此输出&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406025538.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/20120323140602488.png" width="318" height="332" /&gt;&lt;/a&gt;&amp;#160; . 目标表的,1,2 从&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406036552.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406039027.png" width="130" height="46" /&gt;&lt;/a&gt;改成&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406039866.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406062567.png" width="131" height="58" /&gt;&lt;/a&gt;.&amp;#160; &lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406075042.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406079470.png" width="244" height="55" /&gt;&lt;/a&gt;, 因为3,4在目标表里没有.&lt;/p&gt;&lt;p&gt;代码三.&amp;#160; 去掉代码二的注释. 会得到什么呢? 就是删除掉source里面没有, target里面有的记录.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406071945.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406076056.png" width="146" height="114" /&gt;&lt;/a&gt;这两条记录在源表里面木有. 所以要删除.&lt;/p&gt;&lt;p&gt;&lt;a href="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406078531.png"&gt;&lt;img style="background-image: none; border-bottom: 0px; border-left: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top: 0px; border-right: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://images.cnblogs.com/cnblogs_com/jianjialin/201203/201203231406082959.png" width="244" height="236" /&gt;&lt;/a&gt;执行结果.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;扩展: &lt;font size="5"&gt;如何在Merge之后删除已经Merge过去的数据.&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;a title="http://stackoverflow.com/questions/7331725/how-to-delete-from-source-using-merge-command-in-sql-server-2008" href="http://stackoverflow.com/questions/7331725/how-to-delete-from-source-using-merge-command-in-sql-server-2008"&gt;http://stackoverflow.com/questions/7331725/how-to-delete-from-source-using-merge-command-in-sql-server-2008&lt;/a&gt;&lt;/p&gt;&lt;img src="http://www.cnblogs.com/jianjialin/aggbug/2413573.html?type=1" width="1" height="1" alt=""/&gt;&lt;p&gt;&lt;a href="http://www.cnblogs.com/jianjialin/archive/2012/03/23/2413573.html" target="_blank"&gt;本文链接&lt;/a&gt;&lt;/p&gt;</content></entry></feed>
