2011-09-21 37 views
1

SQL更新与我在用的Oracle 11g以下更新查询问题subsubquery

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_B中的每条记录都有多条记录。然而,来自客户的新需求:TABLE_A将获得2个新列,而TABLE_B将被删除。因此,子查询的第一个记录的表示将写入第一个新字段,第二个记录也会写入相同的记录。第一个记录是容易的,因为迈克C'S解决方案可与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 | 
------------------------------------ 
+0

什么是“where row_number = 2”的目的?你想要做什么? – tbone

+0

它在编辑中。需要将TABLE_B中前两个记录的表示匹配TABLE_A中两个新字段中的字段。 – Cantillon

+0

好的,所以一个数据透视表,将tableB中的2行变成tableA中的2列?可以考虑通过CTAS连接2个表格来重新创建tableA。什么是Oracle版本? – tbone

回答

0

我解决了这个问题,使用临时表,从表中删除数据,因为表A被填充。

0

尝试

update TABLE_A a set COL1 = 
    (SELECT b.COL2 FROM 
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 from TABLE_B b, TABLE_A a2 where b.COL3 = a2.COL4) 
    WHERE ROW_NUMBER = 2 
) 

我假设COL3来自B表,也你为什么要在子查询中选择ROWNUM?它只能从WHERE子句中获得2。

+0

请参阅我对MikeG的回答。 – Cantillon

+0

啊,是的,看到rownum的问题。你究竟想要做什么? – OTTA

0
UPDATE TABLE_A a SET COL1 = 
    (SELECT b.COL2 FROM 
    (SELECT ROWNUM AS ROW_NUMBER, b.COL2 FROM TABLE_B b, TABLE_A innerA WHERE COL3 = innerA.COL4) 
    WHERE ROW_NUMBER = 2 
) 
+0

内部选择将返回比我原来的查询中预期更多的记录。而不是从TABLE_B返回匹配正在从TABLE_A更新的记录的记录,它将从TABLE_B返回匹配来自TABLE_A的任何记录的记录。 – Cantillon

+0

好的。如果您在原始问题中描述您试图通过查询实现的目标,可能会有所帮助。 –

0

你可以消除这样的子查询之一吗?

update TABLE_A a set COL1 = 
(SELECT b.COL2 FROM TABLE_B b where COL3 = a.COL4 AND ROWNUM = 2) 
+0

不,请参阅http://stackoverflow.com/questions/6441329/problem-with-rownum – Cantillon

0

我觉得这可能是一个可能的解决您的问题,但根据数据量,你正在处理这可能是很慢,因为是内部声明没有限制因素。

update 
    table_a upd 
set upd.col1 = (
    select 
    sub.col2 
    from 
    (
     select 
     rownum as row_number, 
     b.col2 as col2, 
     b.col3 as col3 
     from 
     table_a a, 
     table_b b 
     where b.col3 = a.col4 
    ) sub 
    where sub.row_number = 2 
    and sub.col3  = upd.col4 
)