【问题标题】:update Informix table with joins使用连接更新 Informix 表
【发布时间】:2012-06-11 21:19:45
【问题描述】:

这是 Informix 更新的正确语法吗?

update table1
set table1.code = 100
from table1 a, table2 b, table3 c
where a.key = c.key
a.no = b.no
a.key = c.key
a.code = 10
b.tor = 'THE'
a.group = 4183
a.no in ('1111','1331','1345')

我收到一般的 -201 'A syntax error has occurred' 消息,但我看不出有什么问题。

【问题讨论】:

  • 显示的语法缺少大量的 AND 关键字。

标签: sql informix


【解决方案1】:

很遗憾,接受的答案会导致 Informix Dynamic Server 版本 11.50 出现语法错误。

这是避免语法错误的唯一方法:

update table1
set code = (
  select 100
  from table2 b, table3 c
  where table1.key = c.key
  and table1.no = b.no
  and table1.key = c.key
  and table1.code = 10
  and b.tor = 'THE'
  and table1.group = 4183
  and table1.no in ('1111','1331','1345')
)

顺便说一句,get Informix version,运行以下 SQL:

select first 1 dbinfo("version", "full") from systables;

更新:另见this answer

更新:另见the docs

【讨论】:

  • 11.70 版也是如此
  • 11.10 版也是如此
【解决方案2】:

您的语法错误是 table1.code

set table1.code = 100

改成

set a.code = 100

完整代码

update table1
set a.code = 100
from table1 a, table2 b, table3 c
where a.key = c.key
and a.no = b.no
and a.key = c.key
and a.code = 10
and b.tor = 'THE'
and a.group = 4183
and a.no in ('1111','1331','1345')

【讨论】:

  • 嗨,我有一个类似的更新/连接查询,但不是将 a.code 值设置为静态值 100,我需要引用连接表上的列值。我试过 'table3.key' 和 'c.key' 但没有运气。
  • 很遗憾,这会导致 Informix 11.50 中出现语法错误。 (要获取 Informix 服务器版本,请运行 SQL select first 1 dbinfo("version", "full") from systables;
【解决方案3】:

问题中的原始 SQL 是:

update table1
set table1.code = 100
from table1 a, table2 b, table3 c
where a.key = c.key
a.no = b.no
a.key = c.key
a.code = 10
b.tor = 'THE'
a.group = 4183
a.no in ('1111','1331','1345')

这是无条件地缺少一系列 AND 关键字。公认的解决方案还通过使用table1 而不是其别名a 来识别SET 子句中的问题。这可能很重要;我无法测试它(见下面的讨论)。因此,假设连接 UPDATE 完全被接受,更正后的 SQL 应该是:

UPDATE table1
   SET a.code = 100
  FROM table1 a, table2 b, table3 c
 WHERE a.key = c.key
   AND a.no = b.no
   AND a.key = c.key
   AND a.code = 10
   AND b.tor = 'THE'
   AND a.group = 4183
   AND a.no IN ('1111','1331','1345')

这与(语法更正)接受的答案相同。但是,我很想知道您正在使用哪个版本的 Informix 接受 FROM 语法(可能是 XPS?)。我在 Mac OS X 10.7.4 上使用 IDS 11.70.FC2(当前 11.70.FC5 版本后面的 3 个修复包),但无法使用 FROM 语法进行更新。此外,IBM 的Informix 11.70 Information Center 更新手册没有提到它。我不确定如果您使用 ODBC 或 JDBC 是否会有所不同;不应该,但我使用的是 ESQL/C,它将未更改的 SQL 发送到服务器。

我尝试的符号是(+ 是提示符):

+ BEGIN;
+ CREATE TABLE a(a INTEGER NOT NULL, x CHAR(10) NOT NULL, y DATE NOT NULL);
+ INSERT INTO a(a, x, y) VALUES(1, 'obsoletely', '2012-04-01');
+ INSERT INTO a(a, x, y) VALUES(2, 'absolutely', '2012-06-01');
+ CREATE TABLE b(b INTEGER NOT NULL, p CHAR(10) NOT NULL, q DATE NOT NULL);
+ INSERT INTO b(b, p, q) VALUES(3, 'daemonic', '2012-07-01');
+ SELECT * FROM a;
1|obsoletely|2012-04-01
2|absolutely|2012-06-01
+ SELECT * FROM b;
3|daemonic|2012-07-01
+ SELECT *
  FROM a, b
  WHERE a.a < b.b
    AND b.p MATCHES '*a*e*';
1|obsoletely|2012-04-01|3|daemonic|2012-07-01
2|absolutely|2012-06-01|3|daemonic|2012-07-01
+ UPDATE a
  SET x = 'crumpet'
  FROM a, b
  WHERE a.a < b.b
    AND b.p MATCHES '*a*e*';
SQL -201: A syntax error has occurred.
SQLSTATE: 42000 at <<temp>>:23
+ SELECT * FROM a;
1|obsoletely|2012-04-01
2|absolutely|2012-06-01
+ ROLLBACK;

【讨论】:

【解决方案4】:

这取决于您使用的版本。如果您至少使用 11.50,最好的解决方案是:

MERGE INTO table1 as t1
USING table2 as t2
   ON t1.ID = t2.ID
WHEN MATCHED THEN UPDATE set (t1.col1, t1.col2) = (t2.col1, t2.col2);

在高于 11.50 的版本中删除了 UPDATE - SET - FROM - 语法。

如果您使用的是早期版本,则可以使用

UPDATE t SET a = t2.a FROM t, t2 WHERE t.b = t2.b;

【讨论】:

  • 他在询问 INFORMIX
【解决方案5】:

对于 Informix SE 7.25...

  1. UPDATE ... FROM ... 语法不存在
  2. 您还“无法修改子查询中使用的表或视图” 这是在使用Rockallite's answer 时给出的

另一种解决方案是将其分解为两个查询:

首先,获取所需记录的 ROWID(在多个表上过滤):

SELECT a.ROWID
  FROM table1 a, table2 b, table3 c
 WHERE a.key = c.key
   AND a.no = b.no
   AND a.key = c.key
   AND a.code = 10
   AND b.tor = 'THE'
   AND a.group = 4183
   AND a.no IN ('1111','1331','1345')

将结果放入逗号分隔的字符串中。

然后,仅更新在第一个查询中找到 ROWID 的主表的那些记录:

UPDATE table1 a
   SET a.code = 100
WHERE a.ROWID in ([comma separated ROWIDs found above])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    • 2016-12-11
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多