代码改变世界

關於Sql server 2005的子查詢、

2009-10-26 10:44  北冥有魚,其名為坤、  阅读(244)  评论(0编辑  收藏  举报

本文對Northwind數據庫操作、
1、標量子查詢。
     只有標量子查詢,返回的是單個記錄或者不返回,就是有效的子查詢.
2、獨立子查詢。
     Ex1:返回每個美國員工至少為其處理過訂單的所有客戶。
     --思路: 子查詢得到所有被美國員工處理過訂單的客戶,對Customer客戶分組且Employee不同員工數等於搜有美國員工數.
  

Code

 

  Ex2:返回在每月最後实际订单日期发生的订单
  -- 思路:子查詢按月分组得到每月最近的单日期。
  

Select OrderID,CustomerID,EmployeeID,OrderDate from Orders where OrderDate in
(
Select Max(OrderDate) From Orders Group by Convert(char(6),OrderDate,112))
--112表示YYYYMMDD char(6)表示提取YYYYMM

 

3、相關子查詢、  
  引用外部查詢列的子查詢。邏輯上講,子查詢會為外部查詢的每行計算一次、
  Ex3:查詢每個員工最近日期的最近一個訂單、

  --思路:兩個子查詢(無先後記錄)
  

Code

 

4、Exists()、
  輸入是一個查詢,是否產生行,返回true或false,不返回Unknown。查詢中帶*不是一個好習慣,但Exists語句中可以適應,
  它只關心返回行,優化器忽略查詢中的料表.

  Ex4:返回來自spain且發生過訂單的Customer.

Code

      NotExists與Not in的區別(區別不大,產生相同執行計畫)|
      Not in(當存在null的時候)是不返回記錄的,所以要去掉null的情況,將和Not exists產生相同查詢結果.
      但Not in查詢計畫會關心列為null的情況,所以Not exists性能更好點、

Select CustomerID,CompanyName From Customers AS c
Where Country=N'Spain' And CustomerID 
NOt In(Select CustomerID From Orders where CustomerID is not Null )