線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2802
推到 Plurk!
推到 Facebook!

MS SQL 2000跟MS SQL 2005的問題

答題得分者是:AndrewK
cursegold
一般會員


發表:16
回覆:36
積分:15
註冊:2006-08-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-05-12 18:19:27 IP:114.45.xxx.xxx 訂閱
我有一段SQL  直接在SQL Server 2005 下執行是
WITH ABC(a1,a2) AS
(
SELECT A.a1,A.a2 FROM A
UNION ALL
SELECT A.a1,A.a2 FROM A
INNER JOIN ABC ON A.a1=ABC.a2
)
SELECT * FROM ABC
ORDER BY a1,a2
OPTION(MAXRECURSION 100)
今天我要幫客戶執行這一段SQL
但客戶家的資料庫SQL Server 2000所以是不能執行上面那一段的會出現錯誤:'Incorrect syntax near the keyword 'WITH''
所以想請問客位高手我因該如何改寫上面那段才能在客戶家的資料庫執行呢
謝謝
------
蔡志全
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-05-13 07:17:28 IP:60.250.xxx.xxx 訂閱
CTE 為 SQL server 2005 之新技術

試問~~
怎麼會想要利用遞迴,當 a.a1 = a.a2 時,讓資料重覆顯示至100筆,用意何在呢??

SQL Server 2000 下也是有解法
重覆的次數可由自己來 handle
而不是遞迴至 100 筆
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-05-13 07:32:06, 註解 無‧
cursegold
一般會員


發表:16
回覆:36
積分:15
註冊:2006-08-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-05-13 08:04:18 IP:114.45.xxx.xxx 訂閱
Andrewk 你好 很抱歉可能當初舉例不是寫的很詳細  我再寫一次好了因該是
WITH ABC(Level,a,b) AS
(
SELECT 0 AS Level,A.a,A.b
FROM AAA as A
UNION ALL
SELECT Level 1,B.a,B.b
FROM AAA as B
INNER JOIN ABC C
ON B.b = C.a
)
SELECT Level,a,b FROM ABC
OPTION(MAXRECURSION 1000)
感謝
===================引 用 AndrewK 文 章===================
CTE 為 SQL server 2005 之新技術

試問~~
怎麼會想要利用遞迴,當 a.a1 = a.a2 時,讓資料重覆顯示至100筆,用意何在呢??

SQL Server 2000 下也是有解法
重覆的次數可由自己來 handle
而不是遞迴至 100 筆
------
蔡志全
編輯記錄
cursegold 重新編輯於 2009-05-13 08:19:47, 註解 無‧
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-05-13 08:51:44 IP:60.250.xxx.xxx 訂閱
Hi
以下您新的例子與原例相比

新例:
WITH ABC(Level,a,b) AS
(
SELECT 0 AS Level,A.a,A.b
FROM AAA as A
UNION ALL
SELECT Level 1,B.a,B.b
FROM AAA as B
INNER JOIN ABC C
ON B.b = C.a
)
SELECT Level,a,b FROM ABC
OPTION(MAXRECURSION 1000)

雖然限制筆數不同,多了重覆流水欄位
但其遞迴運作方式可能如同一開始的例子一樣 ^ ^
當 aaa.a = aaa.b 欄位值相同時,會造成無窮迴圈至限制的 1000 筆

由於 sql server 2000 不支持 with 等語法,若能提供需求原因
才能適切地建議改寫之方式。 ^ ^
===========================================================
Andrewk 你好 很抱歉可能當初舉例不是寫的很詳細 我再寫一次好了因該是
WITH ABC(Level,a,b) AS
(
SELECT 0 AS Level,A.a,A.b
FROM AAA as A
UNION ALL
SELECT Level 1,B.a,B.b
FROM AAA as B
INNER JOIN ABC C
ON B.b = C.a
)
SELECT Level,a,b FROM ABC
OPTION(MAXRECURSION 1000)
感謝
------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-05-13 08:55:43, 註解 無‧
AndrewK 重新編輯於 2009-05-13 15:33:50, 註解 無‧
cursegold
一般會員


發表:16
回覆:36
積分:15
註冊:2006-08-22

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-05-13 09:24:09 IP:114.45.xxx.xxx 訂閱
Andrewk 你好
其實這是一段T-SQL裡面的其中一段
他的目的是要從Table AAA 中找出資料塞給table BBB
一開始SELECT 0 AS Level,A.a,A.b FROM AAA 他的條件是Where A.b='ZZZZ'
假如我們今天找出3筆資料
Level A.a A.b
0 0001 ZZZZ
0 0002 ZZZZ
0 0003 ZZZZ
之後我們在用 A.a 也就是 0001 0002 0003
這3筆資料再去AAA找資料把0001給table AAA的b欄位再去找資料 0002 0003也是 如果今天
0001 找到1筆資料就是
Level A.a A.b
1 1001 0001 0002 找到1筆資料就是
Level A.a A.b
1 2001 0002
0003 找到2筆資料就是
Level A.a A.b
1 3001 0003
1 3002 0003

依此類推 再用他們找出來的 1001...2001 ..3001.3002...等資料去table AAA中找 直到tableAAA中找不到資料為止 或者是遞迴呼叫 1000次為止
最後全部找出來的資料在塞到table BBB中
而我之前用CTE的方式就是希望先收尋出全部資料在塞到table BBB中
如果今天是在SQL Server 2000 要如何改寫呢
還有客戶家的資料是有特別做過的不會有無窮迴圈的問題
感謝



===================引 用 AndrewK 文 章===================
Hi
以下您新的例子與原例相比

新例:
WITH ABC(Level,a,b) AS
(
SELECT 0 AS Level,A.a,A.b
FROM AAA as A
UNION ALL
SELECT Level 1,B.a,B.b
FROM AAA as B
INNER JOIN ABC C
ON B.b = C.a
)
SELECT Level,a,b FROM ABC
OPTION(MAXRECURSION 1000)

雖然限制筆數不同,多了重覆流水欄位
但其遞迴運作方式可能如同一開始的例子一樣 ^ ^
當 aaa.a = aaa.b 欄位值相同時,會造成無窮迴圈至限制的 1000 筆

由於 sql server 2000 不支持 with 等語法,若能提供需求原因
方能建議改寫之方式。
------
蔡志全
編輯記錄
cursegold 重新編輯於 2009-05-13 09:26:31, 註解 無‧
cursegold 重新編輯於 2009-05-13 11:54:27, 註解 無‧
cursegold
一般會員


發表:16
回覆:36
積分:15
註冊:2006-08-22

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-05-13 17:56:02 IP:114.45.xxx.xxx 訂閱
Andrewk 你好
今天想了一天突然有感覺就把它改出來了 測試後也跟之前的2005跑出來的結果一樣
不過還是非常的感謝你耐心的回答我 謝謝
------
蔡志全
AndrewK
高階會員


發表:6
回覆:151
積分:161
註冊:2006-10-09

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-05-14 06:20:39 IP:60.250.xxx.xxx 訂閱
cursegold 您好:

如果要解決【無窮遞迴】的問題,也可以將在 sql server 2000 設定好的 sql ,
放在 sql server 2005 下使用,亦可使用原本 sql server 2005 下的,但限制條件為 aaa.b <> aaa.a
若限制條件不符合使用情況,只有用子查詢代替遞迴使用

沒幫到您什麼忙
你客氣了~~ ^ ^



------
Just Do It
-------------------------
其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。
編輯記錄
AndrewK 重新編輯於 2009-05-14 06:39:22, 註解 無‧
系統時間:2024-05-06 18:13:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!