2016-11-30 50 views
1

我想從表中選擇具有WHERE子句的多行的行,後綴我想格式化日期並覆蓋列。我創建了下面的SQL語句:SQL更新語句與選擇從自己的表在oracle中有多行

UPDATE aufgabenliste.aufgabendefinition 
SET tagesauswahl = (SELECT TO_CHAR(TO_DATE(CONCAT(tagesauswahl,'.2010'), 'DDD.MM.YYYY') , 'DDD.MM') 
        FROM aufgabenliste.aufgabendefinition 
        WHERE aufgabentyp = 4) 
WHERE aufgabentyp = 4; 

我得到所謂的錯誤:

SQL Error: ORA-01427: single-row subquery returns more than one row 

我怎樣才能做一個選擇更新多行使用Oracle同桌?

+0

將日期作爲varchar2存儲是不好的做法。如果可以,最好使用日期類型添加新列,根據當前列填充它,然後刪除舊列。 – Kacper

+0

我同意你的看法,但它是現有數據庫中存在大量數據的現有應用程序,我只需遷移此行。因此,沒有其他方式可以使用這個varchar2列。 –

+1

請在更新之前和之後在表格中提供一些示例數據,以便我們可以嘗試查看您希望執行的操作。表面看來,@ JaydipJ的答案看起來就是你想要做的,除非tagesauswahl列中的數據看起來是一個已經以DDD.MM格式存在的字符串,那麼爲什麼你要更新它到什麼這已經是任何人的猜測。這讓我想,也許你正試圖將它更新到其他日期,但如果沒有示例輸入/輸出數據,這很難說。 – Boneist

回答

2

嘗試此操作:執行此操作之前,請取回您的表格。我非常肯定我的解決方案,但不願承擔風險:)

UPDATE aufgabenliste.aufgabendefinition 
SET tagesauswahl = TO_CHAR(TO_DATE(CONCAT(tagesauswahl,'.2010'), 'DDD.MM.YYYY') , 'DDD.MM') 
WHERE aufgabentyp = 4; 
1
UPDATE aufgabenliste.aufgabendefinition SET tagesauswahl = TO_CHAR(TO_DATE(CONCAT(tagesauswahl,'.2010'), 'DDD.MM.YYYY') , 'DDD.MM') 
WHERE aufgabentyp = 4; 
2
UPDATE aufgabenliste.aufgabendefinition arow 
SET tagesauswahl = (SELECT TO_CHAR(TO_DATE(CONCAT(tagesauswahl,'.2010'), 'DDD.MM.YYYY') , 'DDD.MM') 
        FROM aufgabenliste.aufgabendefinition 
        WHERE ROWID = arow.ROWID) 
WHERE aufgabentyp = 4; 

可以更新使用聯合相關子查詢。
arow是獲取更新表的別名。在子查詢中,我們指的是使用Oracle爲每條記錄提供的唯一ROWID更新的特定行。

1

錯誤SQL Error: ORA-01427: single-row subquery returns more than one row表明你內心的子查詢:

SELECT TO_CHAR(TO_DATE(CONCAT(tagesauswahl,'.2010'), 'DDD.MM.YYYY') , 'DDD.MM') 
        FROM aufgabenliste.aufgabendefinition 
        WHERE aufgabentyp = 4) 

是retruning多行,你不能分配多個記錄單柱不使用循環,因此您的更新失敗。更新的解決方案是要麼將行數限制爲1,要麼執行內部子查詢生成一行的內容。

您可以使用listaggmultiple rows轉換成single row,然後與delimeter分開,然後更新您的表格。請看下圖:

UPDATE aufgabenliste.aufgabendefinition 
SET tagesauswahl = (SELECT listagg(TO_CHAR(TO_DATE(CONCAT(tagesauswahl,'.2010'), 'DDD.MM.YYYY') , 'DDD.MM'),',') within group (order by 1) 
        FROM aufgabenliste.aufgabendefinition 
        WHERE aufgabentyp = 4) 
WHERE aufgabentyp = 4; 

需要注意的是,LISTAGG有一定的侷限性,如果字符串長度增加了VARCHAR的極限,它會失敗。但是,如果您的行數有限,那麼它就可以工作。