【发布时间】:2011-09-21 13:05:53
【问题描述】:
我在 Oracle 11g 中遇到以下更新查询问题:
update TABLE_A a set COL1 =
(SELECT b.COL2 FROM
(SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b where COL3 = a.COL4)
WHERE ROW_NUMBER = 2
)
ORA-00904:“A”。“COL4”:无效 ID。
所以,a.COL4 在子子查询中是未知的,但我不知道如何解决这个问题。
/编辑。我想做什么?
对于 TABLE_A 中的每条记录,TABLE_B 中都有多条记录。然而,来自客户的新要求:TABLE_A 将获得 2 个新列,而 TABLE_B 将被删除。因此,子查询的第一条记录的表示将被写入第一个新字段,第二个字段也是如此。第一个记录很容易,因为 Mike C 的解决方案可以与 ROW_NUMBER = 1 一起使用。
示例行:
TABLE_A
| col0 | col1 | col2 | col3 | col4 |
------------------------------------
| | |dummy2|dummy3| 1 |
------------------------------------
| | |dummy4|dummy5| 2 |
------------------------------------
TABLE_B
| col1 | col2 | col3 |
----------------------
| d |name1 | 1 |
----------------------
| d |name2 | 1 |
----------------------
| d |name3 | 1 |
----------------------
| d |name4 | 2 |
----------------------
TABLE_A after update
| col0 | col1 | col2 | col3 | col4 |
------------------------------------
| name1| name2|dummy2|dummy3| 1 |
------------------------------------
| name4| |dummy4|dummy5| 2 |
------------------------------------
【问题讨论】:
-
“where row_number=2”的目的是什么?你到底想做什么?
-
正在编辑中。需要将 TABLE_B 中前两条记录的表示形式与 TABLE_A 中的字段匹配到 TABLE_A 中的两个新字段中。
-
好的,所以是一个数据透视表,将 tableB 中的 2 行转换为 tableA 中的 2 列?可以考虑通过 CTAS 将 2 个表连接到一个数据透视表中来重新创建 tableA。什么 Oracle 版本?
-
另外,一个简单的表结构示例和一些具有所需输出的测试行会有所帮助
标签: sql oracle sql-update ora-00904