2016-08-05 78 views
0

我在Oracle SQL中有一個表,它的id在遞增,順序排列,但由於編輯(例如,在IDS目前是這樣Oracle更新查詢以按順序更新記錄

22 
23 
24 
32 
33 
44 
...etc 

我籤一個崗位和提供的解決方案是如下:

update (select t.*, row_number() over (order by id) as newid) toupdate 
    set id = newid 

Solution Provided earlier.

現在我的查詢: 1)我猜「FROM子句「在上述查詢中缺少。

更新查詢:

update (select t.*, 
       row_number() over (order by emp_id) as newid 
     from employee t) toupdate 
set emp_id = newid; 

2)當我運行上面的查詢,它給我的錯誤「數據處理操作這種觀點不合法」。

任何人都可以解釋如何提到的解決方案在這裏工作。任何人都可以發佈完整更新查詢。謝謝。

+0

谷歌搜索的錯誤,它說要更新視圖,因此是你的「表」一表或視圖?另外,爲什麼要設計一些對數字非常重要的東西?它是順序的真的很重要嗎? https://community.oracle.com/thread/2485143?start=0&tstart=0 –

+1

@RegencySoftware他正在更新一個虛擬視圖,即'update(select ...)'。一些虛擬視圖可以更新,但不是全部。我同意你的看法,認爲emp_id數字中的差距不應該被認爲是重要的。 –

+0

我的問題是從前面提供的解決方案中提出的。當我要求澄清時,我被要求將疑惑作爲一個問題。因此我做到了。現在尋找解決方案。對我來說,瞭解這種更新將是一個很好的學習。 – XING

回答

1

This solution到同一個問題,你引用展示瞭如何做到這一點:

update employee set emp_id = (
    with tab as (
    select emp_id, rownum r 
    from (select emp_id from employee order by emp_id) 
) 
    select r from tab where employee.emp_id = tab.emp_id 
); 

工程。您無法更新包含像row_number這樣的分析函數的視圖 - 請參閱Oracle 12C docs,查找「關於可更新視圖的註釋」。

+0

感謝這一點,但我在看到得票最多的答案。我想了解戈登今後想要學習的內容。 – XING

+2

哦,我明白了。我不相信戈登的解決方案可以工作,因爲[如此處所述](http://docs.oracle.com/cd/E11882_01/server.112/e41084/statements_8004.htm#SQLRF01504)「該視圖不得包含.. 。「row_number」的聚合或分析函數。 –

+0

這就是我質疑他們,如果你在鏈接中觀察,並從那裏的答覆是,我應該問它作爲一個問題,所以我做到了。我驚訝它也得到2 upvotes以及,,, :-)))。 – XING

1

您可以使用merge,但您需要加入除emp_id之外的其他內容,因爲您要更新該列。如果沒有其他唯一列,你可以使用rowid

merge into employee target 
using (select rowid, row_number() over (order by emp_id) as emp_id from employee) source 
on (source.rowid = target.rowid) 
when matched then update set target.emp_id = source.emp_id; 
+0

感謝您的這一點,但我在看到得票最多的答案。我想了解戈登今後想要學習的內容。 – XING

+2

我認爲(異乎尋常)戈登的答案是錯誤的;不確定爲什麼它被接受,因爲它在Oracle中不起作用...在這種情況下,評論可能更合適,雖然也許你最初的一個不是男性,但它完全清楚它不能像寫作一樣工作。 –

+0

那麼我在那裏提出了一個問題。肯定他是錯的,或者我/我們弄錯了他。他必須在這裏解釋。 – XING