2017-12-27 480 views
1

裏面我用子查詢CASE聲明,並在子查詢我們希望與自動序列值或計數器值一起一列。例如 CASE聲明裏面查詢就是這樣的,我們通過一列col1WHERE的條件下&得到輸出col2以及CNT裏面的CASE語句使用子查詢與生成序列ID

(CASE WHEN (SELECT COL2, ROWNUM AS CNT FROM TAB1 WHERE COL1 = COL1) THEN ....) 

每當任何值col1將匹配,則col2的輸出將被與CNT增量值產生沿。

CNT是這裏計數器的值等1,2,3,4,.....哪一個是更好的選擇或者使用計數器序列

+3

似乎查詢不作任何意義嗎? CASE的WHEN子句必須評估爲「true」或「false」,而不是數據表。 –

+0

在Oracle中,我只會使用'rownum'。 –

回答

1

「哪一個是更好的選擇,或者使用計數器或序列。」

您是否總是希望CNT以1開頭?如果是這樣,你不想要一個序列。

有許多不同的方法可以爲CNT生成一個值。最簡單的就是使用rownum僞列:

SELECT COL1, rownum as CNT FROM TAB1 WHERE 

這是一個很好的解決方案,當你不小心給定行是否是1299999。如果你有一些特殊的要求,你可能要使用的解析函數像row_number()代替:

SELECT COL1, row_number() over (order by COL2) as CNT FROM TAB1 WHERE 
+1

請檢查一次編輯。這裏傳遞一個參數&獲得第二列與計數器。 –

+0

對不起,但我不明白你的意思。請提供一些示例輸入數據和您的預期輸出。 – APC

+0

但我沒有得到增量值時,我使用row_number()以及rownum兩者。我想增加值,如1,2,3,4 ... –

1

一般來說,「更好」取決於你想要做什麼。

有幾個可能的情形:

  1. 你集返回給調用一些代碼/用戶的結果。調用序列可能是不必要的開銷,並且不允許使用更復雜的行編號表達式。

    在這種情況下,我會使用哪個最適合的rownum和各種分析行編號函數,row_number()rank()dense_rank()

    由於您的查詢是如何構建的很可能是你應該使用這種方法的。

  2. 您正在將此數據插入表中。我更喜歡序列是一個標識列或在12c之前,在觸發器。這是因爲除了單個語句之外的其他代碼可能會執行插入操作,並且您希望確保更改表中數據的所有傳入數據都以相同方式處理。

    換句話說,不要在您的代碼中使用序列來執行此操作。

  3. 您正在生成一個唯一標識,您將向用戶顯示並插入表中。如果您有手動批准步驟,這種結構最有用。由於(2)中詳述的原因,您要使用序列來確保數據處理相同。

    另一種可能會導致鎖定的方法是執行插入操作,然後向用戶顯示未提交的數據。用戶然後必須提交或回滾適當的。

    如果您正在進行這些操作,您將失去未提交的序列值。這根本不重要,但由於某種原因它困擾了一些人。