首先,我根本不习惯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,但也许,它只是语法,在动作后引用表(这里更新)。
答案 0 :(得分:0)
这样做
UPDATE T1 t, C2 c
SET t.adr = c.adr
WHERE t.cli != c.cli;
答案 1 :(得分:0)
如果你扩展了你想要实现的内容会很有帮助,因为你发布的查询相当抽象,看起来应该有另一个列可以用来连接T1
中的行和C1
。
但是,根据您的要求,您可以尝试这样的事情:
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 )