Sql &引用;子查询返回的不是一行;错误
我整晚都在网上搜索,试图找到答案。。。到目前为止运气不好。我尝试过的所有其他解决方案都会导致语法错误 我正在尝试运行update语句来更新选择项的位置id值。我有两个表:一个现有库存表和一个临时库存表,其中包含物料id值和新位置id值的子集。我想用临时库存表中的新货位id值更新库存表中的当前货位id值,但仅适用于临时库存表中的项目 库存表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
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
进行计数和分组。任何超过一个的人都将是你的罪魁祸首。