2010-05-13 51 views
1

這裏上是查詢:嵌套SQL SELECT語句失敗SQL Server 2000上,確定SQL Server 2005的

INSERT INTO @TempTable 
    SELECT 
     UserID, Name, 
     Address1 = 
     (SELECT TOP 1 [Address] FROM 
      (SELECT TOP 1 [Address] FROM [UserAddress] ua 
      INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID 
      WHERE ua.UserID = u.UserID 
      ORDER BY uo.AddressOrder ASC) q 
      ORDER BY AddressOrder DESC), 
     Address2 = 
     (SELECT TOP 1 [Address] FROM 
      (SELECT TOP 2 [Address] FROM [UserAddress] ua 
       INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID 
       WHERE ua.UserID = u.UserID 
       ORDER BY uo.AddressOrder ASC) q 
      ORDER BY AddressOrder DESC) 
     FROM 
     User u 

在這種情況下,用戶有多個地址的定義,與整型字段指定首選順序。 「地址2」(第二個首選地址)嘗試取前兩個首選地址,按降序排列,然後從結果中取第一個地址。你可能會說,只要使用一個子查詢,在Order域中使用「2」做記錄的SELECT,但Order值不是連續的。

怎麼可以這樣被改寫,以符合SQL 2000的限制?

非常讚賞。

[編輯]

當我與實際的用戶ID的WHERE子句中替換u.UserID,SQL Server 2000不抱怨。看來,SQL 2000不能處理將內部引用(u.UserID)鏈接到外部表(User u)。

同樣,拋出的錯誤是:

Msg 8624, Level 16, State 16, Line 24 
Internal SQL Server error. 
+1

你跟SQL 2000得到什麼錯誤? – SqlACID 2010-05-13 00:17:12

+0

錯誤是: 消息8624,級別16,國16條,第24行 內部SQL Server錯誤。 – Jay 2010-05-13 16:02:07

回答

0

由於問題是由於不能夠在線路INNER JOIN UserAddressOrder uo ON ua.UserID = uo.UserID解決該內部參考uo.UserID,我取代了線與到其接受的函數的調用作爲參數的值爲uo.UserID

這不優雅的解決這個問題,但是它完成了任務(雖然有輕微的性能損失)。