Sql &引用;子查询返回的不是一行;错误

Sql &引用;子查询返回的不是一行;错误,sql,updates,informix,Sql,Updates,Informix,我整晚都在网上搜索,试图找到答案。。。到目前为止运气不好。我尝试过的所有其他解决方案都会导致语法错误 我正在尝试运行update语句来更新选择项的位置id值。我有两个表:一个现有库存表和一个临时库存表,其中包含物料id值和新位置id值的子集。我想用临时库存表中的新货位id值更新库存表中的当前货位id值,但仅适用于临时库存表中的项目 库存表 item_id location_id 123453 12-099 123454 12-100 123456 12-101 1

我整晚都在网上搜索,试图找到答案。。。到目前为止运气不好。我尝试过的所有其他解决方案都会导致语法错误

我正在尝试运行update语句来更新选择项的位置id值。我有两个表:一个现有库存表和一个临时库存表,其中包含物料id值和新位置id值的子集。我想用临时库存表中的新货位id值更新库存表中的当前货位id值,但仅适用于临时库存表中的项目

库存

item_id    location_id

123453     12-099
123454     12-100
123456     12-101
123457     12-102
123458     12-103
item_id    location_id

123456     13-101
123457     13-102
123458     13-103
item_id    location_id

123453     12-099
123454     12-100
123456     13-101
123457     13-102
123458     13-103
临时库存表格

item_id    location_id

123453     12-099
123454     12-100
123456     12-101
123457     12-102
123458     12-103
item_id    location_id

123456     13-101
123457     13-102
123458     13-103
item_id    location_id

123453     12-099
123454     12-100
123456     13-101
123457     13-102
123458     13-103
预期结果:

库存

item_id    location_id

123453     12-099
123454     12-100
123456     12-101
123457     12-102
123458     12-103
item_id    location_id

123456     13-101
123457     13-102
123458     13-103
item_id    location_id

123453     12-099
123454     12-100
123456     13-101
123457     13-102
123458     13-103
我正在运行下面的update语句并收到错误“284:子查询返回的不是一行。”

使用联接查询:

UPDATE inventory i
INNER JOIN  temp_inv it
ON i.item_id    = it.item_id    
SET i.location_id= it.location_id;

你可以试试这样的(参见)。我选择PostgreSQL作为示例,因为Informix是从Postgres稳定版(Michael Stonebraker参与了这两个版本)衍生而来的产品,而且我所知道的Informix Fiddle并不存在。由于供应商之间的竞争,这些更新可能会很棘手

创建并填充
库存
表格:

CREATE TABLE inventory
(
  item_id INTEGER NOT NULL,
  location_id VARCHAR (25) NOT NULL
);


INSERT INTO inventory VALUES (123453, '12-099'), (123454, '12-100'), (123456, '12-101'),
(123457, '12-102'), (123458, '12-103');
临时库存相同

CREATE TABLE temp_inv
(
  item_id INTEGER NOT NULL,
  location_id VARCHAR (25) NOT NULL
);

INSERT INTO temp_inv VALUES (123456, '13-101'), (123457, '13-102'), (123458, '13-103');
然后运行以下SQL:

UPDATE inventory
SET location_id = temp_inv.location_id
FROM temp_inv
WHERE inventory.item_id = temp_inv.item_id;
结果(如预期):

然后

结果:

item_id location_id
 123453      12-099
 123454      12-100
 123456      13-101
 123457      13-102
 123458      13-103

瞧!p、 欢迎来到论坛!:-)

问题可能是您的关联条件。限定列名

UPDATE inventory
    SET location_id = (SELECT temp_inv.location_id
                       FROM temp_inv
                       WHERE inventory.item_id = temp_inv.item_id
                      );
如果您仍然有问题,您需要选择一个匹配的行——或者调查为什么有重复的行!一个解决方案是
limit
,我认为Informix在子查询中支持它:

UPDATE inventory
    SET location_id = (SELECT temp_inv.location_id
                       FROM temp_inv
                       WHERE inventory.item_id = temp_inv.item_id
                       LIMIT 1
                      );
否则,聚合将起作用:

UPDATE inventory
    SET location_id = (SELECT MAX(temp_inv.location_id)
                       FROM temp_inv
                       WHERE inventory.item_id = temp_inv.item_id
                      );

注意:对于不匹配的行,您尝试的查询以及所有这些查询将把值设置为
NULL

这通常意味着子查询返回多行。:-)要找出哪个
location\u id
为您的查询返回了多行,您可以对
temp\u inv
表的
location\u id
item\u id
进行计数和分组。任何超过一个的人都将是你的罪魁祸首。