SQL更新语句,在oracle中从自己的表中选择多行

时间:2016-11-30 09:02:33

标签: sql oracle select

我想从带有WHERE子句的表中选择多行行,之后我想格式化日期并覆盖列。我创建了以下SQL语句:

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为同一个表选择多行?

4 个答案:

答案 0 :(得分:2)

试试这个:在执行此操作之前,请取回您的表格。我对我的解决方案非常肯定,但不想承担风险:)

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

答案 1 :(得分: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来更新特定行。

答案 2 :(得分:1)

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

答案 3 :(得分: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)

正在重新运行多行,如果不使用循环,则无法将多个记录分配给单个列,因此更新失败。更新的解决方案是将行数限制为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的限制,它将失败。但是如果你的行数有限,那就行了。