SQL oracle更新使用多张表

Posted

技术标签:

【中文标题】SQL oracle更新使用多张表【英文标题】:SQL oracle update using several tables 【发布时间】:2013-11-29 11:05:43 【问题描述】:

首先,我根本不习惯 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,但也许只是语法,在操作之后引用表(这里更新)。

【问题讨论】:

这可能有助于***.com/questions/2446764/… @FaizanKhan:第二个查询不是“工作正常”。对于 Oracle,这是无效的 SQL。 您到底想达到什么目标?目前看来,您希望将t.adr 设置为c2.adr 的值,其中t.cli is not equal to c2.cli 可能导致多个值 【参考方案1】:

这样就可以了

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

【讨论】:

Oracle 的UPDATE 中不能指定多个表。【参考方案2】:

如果您扩展您想要实现的目标将会很有帮助,因为您发布的查询相当抽象,并且看起来应该有另一列可用于连接 T1 和 @ 中的行987654324@.

但是,根据您的要求,您可以尝试以下方法:

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() 进行聚合,那么(对于我创建的测试数据)不等于条件将匹配多行并且您会收到错误:

查询 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 )

【讨论】:

以上是关于SQL oracle更新使用多张表的主要内容,如果未能解决你的问题,请参考以下文章

oracle通过两张表更新一张表

Oracle SQL:使用另一个表中的数据更新表

SQL-Oracle 使用 LAG() 从自身更新表

Oracle SQL:使用来自同一表的另一列的数据更新表

使用重复值更新 Oracle SQL - 表

oracle sql developer 能否直接修改sql查询出的数据?