使用多个表的SQL oracle更新

时间:2013-11-29 11:05:43

标签: sql oracle sql-update

首先,我根本不习惯SQL语法。 我面临以下问题。 T1和C2是我的两张桌子。我希望这样做:

UPDATE T1 t 
SET t.adr = C2.adr 
WHERE t.cli != C2.cli;

我有以下错误:C2.adr and C2.cli : invalid identifier

我应该这样做:

UPDATE T1 t, C2 c 
SET t.adr = c.adr 
WHERE t.cli != c.cli;

这有点奇怪,因为我不更新C2,但也许,它只是语法,在动作后引用表(这里更新)。

2 个答案:

答案 0 :(得分:0)

这样做

UPDATE T1 t, C2 c 
SET t.adr = c.adr 
WHERE t.cli != c.cli;

答案 1 :(得分:0)

如果你扩展了你想要实现的内容会很有帮助,因为你发布的查询相当抽象,看起来应该有另一个列可以用来连接T1中的行和C1

但是,根据您的要求,您可以尝试这样的事情:

SQL Fiddle

Oracle 11g R2架构设置

CREATE TABLE T1 ( cli, adr ) AS
          SELECT 1, 1 FROM DUAL
UNION ALL SELECT 2, 2 FROM DUAL
UNION ALL SELECT 3, 3 FROM DUAL
UNION ALL SELECT 4, 4 FROM DUAL;

CREATE TABLE C1 ( cli, adr ) AS
          SELECT 1, 5 FROM DUAL
UNION ALL SELECT 2, 6 FROM DUAL
UNION ALL SELECT 3, 7 FROM DUAL
UNION ALL SELECT 4, 8 FROM DUAL;

查询1

UPDATE T1 t
SET    adr = ( SELECT MIN( c.adr )
               FROM   C1 c
               WHERE  c.cli <> t.cli )

查询2

SELECT * FROM T1

<强> Results

| CLI | ADR |
|-----|-----|
|   1 |   6 |
|   2 |   5 |
|   3 |   5 |
|   4 |   5 |

它不像你要求的那样,因为我必须放入MIN( c.adr )以确保子查询返回单行,但它给出了一个如何在更新查询中引用第二个表的示例

如果你没有使用MIN()进行聚合,那么(对于我创建的测试数据),not equals条件将匹配多行,并且会出现错误:

查询3

UPDATE T1 t
SET    adr = ( SELECT c.adr
               FROM   C1 c
               WHERE  c.cli <> t.cli )

<强>结果:

ORA-01427: single-row subquery returns more than one row : UPDATE T1 t SET adr = ( SELECT c.adr FROM C1 c WHERE c.cli <> t.cli )