2016-11-28 29 views
0

最近我通過過濾ID的像下面寫了選擇查詢存儲過程:「敬告不依賴於ID列值,而不是喜歡CTE」

create procedure procname(@compId as int) 
as 
begin 
select Id,value,text 
from tableName 
where Id not in(5,8,19) 
and compId [email protected] 
order by text asc 

不幸的是我的引線提供郵件像

不建議在這裏依賴Id列值。明確選擇它們通過CTE(公用表表達式)表示的內容是非常優選的。

在這裏,我無法完全理解CTE的含義。

+0

你的程序中的@compId參數是什麼?它在您的查詢中未被引用。 –

+0

編輯請檢查一次。 –

+1

沒有解釋就冷靜下來的人是匿名懦夫。也許他/她低估了,因爲你沒有添加任何解釋你爲什麼將'id'限制在一定的值上。如果你想對你的問題得到正確的答案,所有相關的背景都很重要。 –

回答

1

很可能,您的團隊負責人擔心,從業務邏輯的角度來看,Id not in (5, 8, 19)可能沒有任何意義。我的意思是你限制你的查詢到某個Id值,但這些數字本身是任意的。

作爲一個可能導致警告消失的例子,如果有一列,比如說some_col,它們的值都是Id值5,8,19,並且沒有其他值,那麼你可以修改您的查詢如下:

select Id, value, text 
from tableName 
where some_col != 'some value' 

現在,您的查詢背後的邏輯清晰;你想要某個列沒有特定值的記錄。如果Id值曾經發生變化,您的原始查詢可能會中斷,但現在這種可能性要小得多。如果在稍後的某個時間點,您不得不在IN條款中添加新的Id值,您現在就不會這樣做。

如果你必須明確指明Id值,那麼潛在客戶建議你使用CTE來獲取基礎表的快照。這是解決查詢中硬編碼隨機數字的另一種方法,但我更喜歡我的第一個建議,即完全取消ID。

+0

我瞭解你的第一個建議。但無法理解爲什麼以及如何選擇CTE。據我所知,我們會在遞歸的情況下去CTE。 –

+1

我認爲他們只是不希望你硬編碼這些ID到你的存儲過程。通過創建CTE,可以監視邏輯,理想情況下,您可以用更有意義和更穩定的內容替換硬編碼的ID。 –

+0

如果你明白你能否請用CTE爲上述查詢構造代碼? –