我整晚都在网上搜索,试图找到这个问题的答案。。。到目前为止运气不好。我尝试过的所有其他解决方案都导致了语法错误。
我正在尝试运行一个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
等等!附言:欢迎光临论坛!:-(