2010-11-23 31 views
2

我剛剛發現了一個適當的解決方案,將存儲過程編碼爲How to Find Rows which are Duplicates by a Key but Not Duplicates in All Columns?,然後得知數據庫停留在SQL Server 2000.如何使用通用表表達式將SQL查詢轉換爲無(適用於SQL Server 2000)

當然,我的解決方案很大程度上依賴於公用表表達式。

任何人都可以提供一套ru轉換回SQL Server 2000方言?

請注意,我有事情喜歡thisL:

; 
WITH CTE1 AS (...), 
CTE2 AS (SELECT ... FROM CTE1 ...), 
CTE3 AS (SELECT ... FROM CTE1 INNER JOIN CTE2 ...) 
SELECT * FROM CTE3 
WHERE criteria 
ORDER BY sequence 

這似乎使事情變得更加有趣......


更新:無的CTE的是遞歸的。

+0

約翰,我相信這只是一個疏忽,您引用的帖子中的答案都不會被標記爲答案。 – 2010-11-23 02:26:12

+0

@RC_Cleland:這不是疏忽。這個帖子是從昨天開始的,我沒有機會嘗試這些建議。截止日期是這樣的。例如,這個問題(2000年遷移)在昨天17:08發生 - 不到一個小時,我不得不離開一天。 – 2010-11-23 17:14:22

+0

如果你實際上有一個單一的查詢來轉換它可能會更容易做到這一點,而不是轉換通用的東西,特別是如果你有示例源和結果數據進行驗證。 – 2011-02-18 05:55:42

回答

6

兩個選項(當然,也不是漂亮的 - 這就是爲什麼我們喜歡的CTE)

OPTION 1

創建臨時表(#,或者如果有足夠@小),並把它稱爲你會CTE。完成後放下。

OPTION 2 把整個CTE SELECT作爲表中查詢的FROM部分。

SELECT * 
FROM (SELECT * 
     FROM table1) oldCTE 
3

我不認爲有可能提出的規則,很容易將任何 cte轉換爲非cte語句。因爲可能性太過於開放(特別是如果您使用遞歸CTE)。我能想到的最接近的方法是按順序接受每個CTE,將其分解到它自己的查詢中,並使用它填充由以下查詢使用的臨時表。幾乎沒有效率,並沒有在所有可能的情況下工作。