"A subquery has returned not exactly one row"错误



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

我正在尝试运行一个update语句来更新选择项的location_id值。我有两个表:一个是现有的INVENTORY表,另一个是TEMP_INV表,其中包含item_id值和新的location_id值的子集。我想用TEMP_INV表中的新location_id值更新INVENTORY表中的当前location_id,但仅针对TEMP_INV表格中的项目。

库存表格

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

TEMP_INV表格

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

我正在运行下面的更新语句,并收到错误"284:Asubquery返回的不是一行。">

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

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

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

使用联接查询:

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

您可以尝试这样的方法(请参阅fiddle(。我选择PostgreSQL作为示例,因为Informix是Postgres稳定版的衍生产品(Michael Stonebraker参与了这两个版本(,而且我不知道Informix有什么问题。由于供应商之间的语法不同,这些更新可能很棘手。

创建并填充inventory表:

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');

temp_inv:相同

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;

结果(如预期(:

3 rows affected

然后

SELECT * FROM inventory;

结果:

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

等等!附言:欢迎光临论坛!:-(

相关内容

最新更新