我的資料庫中有一個 ANAGRAFICA 表,有 4 個名稱:fabio、mrco、marco、mchele 但 mrco 和 mchele 不正確(列是 NOME)。我使用此查詢通過行號選擇名稱:
SELECT NOME FROM
(SELECT NOME, ROW_NUMBER() OVER (ORDER BY (NULL)) R FROM ANAGRAFICA)
WHERE R = 2;
例如它給了我'mrco'。太好了,但是如何修改我的查詢以更新以更正該特定行號上的名稱?
uj5u.com熱心網友回復:
所以你說;這在我的資料庫中有所不同:
SQL> select nome,
2 row_number() over (order by null) r
3 from anagrafica;
NOME R
------ ----------
mrco 1
fabio 2 --> 2 isn't "mrco" but "fabio"
marco 3
mchele 4
SQL>
怎么會?因為ORDER BY NULL就像沒有ORDER BY條款一樣好。換句話說,那些行號是無用的;您本可以使用ROWNUM并獲得相同的最終結果(沒用)。
您如何判斷“fabio”是否不正確(或正確)?或者 - 好吧,讓它成為“mrco” - 你會將它的值更新為什么?
在我看來,唯一有意義的選擇是
SQL> update anagrafica set nome = 'marco' where nome = 'mrco';
1 row updated.
無論如何:如果這是一個真正有意義的問題,rowid偽列可能會有用。這是如何做:
SQL> select nome,
2 row_number() over (order by null) r,
3 rowid
4 from anagrafica;
NOME R ROWID
------ ---------- ------------------
mrco 1 AAAF3xAAEAAAAuDAAA
fabio 2 AAAF3xAAEAAAAuDAAB
marco 3 AAAF3xAAEAAAAuDAAC
mchele 4 AAAF3xAAEAAAAuDAAD
SQL>
將其update用作:
SQL> update anagrafica a set
2 a.nome = 'little'
3 where a.rowid = (select b.rwd
4 from (select row_number() over (order by null) r,
5 rowid rwd
6 from anagrafica
7 ) b
8 where b.r = 2
9 );
1 row updated.
SQL> select * from anagrafica;
NOME
------
mrco
little
marco
mchele
SQL>
它更新了row_number分析函式回傳值等于的行2。再一次-正如您所說,您無法真正分辨出它是哪一行(當然也無法將其更新為“有效”值,因為您不知道要更新的內容,因此無法指定新值)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/428093.html
標籤:甲骨文
