我想从带有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为同一个表选择多行?
答案 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或执行内部子查询结果为单行的操作。
您可以使用listagg
将multiple 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的限制,它将失败。但是如果你的行数有限,那就行了。