如何从 Informix 中的 SELECT 更新?

Zan*_*non 0 sql informix

我正在尝试使用另一个表中的数据进行更新。我已经尝试过这个答案(第二部分),但它对我不起作用。我收到一条语法错误的通用错误消息。

我也试过这个解决方案,也收到了一个语法错误消息。

如果我尝试只更新一列,它会起作用:

UPDATE dogs
SET name = 
    (
        SELECT 'Buddy'
        FROM systables 
        WHERE tabid = 1
     );
Run Code Online (Sandbox Code Playgroud)

但我需要更新倍数列。不幸的是,这不起作用:

UPDATE dogs
SET (name, breed) = 
    (
        SELECT 'Buddy', 'pug'
        FROM systables 
        WHERE tabid = 1
    );
Run Code Online (Sandbox Code Playgroud)

Informix 版本是 12.10.FC8

Luí*_*ues 6

您在子查询周围缺少 1 组括号。从Informix 手册

子查询必须用括号括起来。这些括号嵌套在紧跟在等号 ( = ) 之后的括号内。如果表达式列表包含多个子查询,则每个子查询必须用括号括起来,并用逗号 ( , ) 分隔连续的子查询:

UPDATE ... SET ... = ((subqueryA),(subqueryB), ... (subqueryN))
Run Code Online (Sandbox Code Playgroud)

以下示例显示了 SET 子句中子查询的使用:

UPDATE items    
SET (stock_num, manu_code, quantity) = 
  ( 
    (
      SELECT stock_num, manu_code 
       FROM stock     
       WHERE description = 'baseball'
    ),
    2
  )    
WHERE item_num = 1 AND order_num = 1001;

UPDATE table1    
SET (col1, col2, col3) =
  (
    (
      SELECT MIN (ship_charge), MAX (ship_charge) 
      FROM orders
    ),
    '07/01/2007'
  )
WHERE col4 = 1001;
Run Code Online (Sandbox Code Playgroud)

因此,为了让 Informix 接受您的更新,它必须是:

UPDATE dogs
SET (name, breed) = 
  (
    (
      SELECT 'Buddy', 'pug'
      FROM systables 
      WHERE tabid = 1
    )
  );
Run Code Online (Sandbox Code Playgroud)