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更新使用多张表的主要内容,如果未能解决你的问题,请参考以下文章