MS SQL 2000跟MS SQL 2005的問題 |
答題得分者是:AndrewK
|
cursegold
一般會員 ![]() ![]() 發表:16 回覆:36 積分:15 註冊:2006-08-22 發送簡訊給我 |
我有一段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 發送簡訊給我 |
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 發送簡訊給我 |
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 發送簡訊給我 |
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 ------------------------- 其實男生不是真的喜歡你不減肥,而是喜歡你愛吃還不肥;也不是真的喜歡你不化妝,而是喜歡你素顏也好看;也不是真的喜歡你瘦,而是喜歡你瘦卻有胸;也不是真喜歡你獨立,而是他忙的時候別煩他。女孩子,太認真你就輸了。 |
cursegold
一般會員 ![]() ![]() 發表:16 回覆:36 積分:15 註冊:2006-08-22 發送簡訊給我 |
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
一般會員 ![]() ![]() 發表:16 回覆:36 積分:15 註冊:2006-08-22 發送簡訊給我 |
|
AndrewK
高階會員 ![]() ![]() ![]() ![]() 發表:6 回覆:151 積分:161 註冊:2006-10-09 發送簡訊給我 |
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, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |