我整夜都在网上搜索,试图找到答案……到目前为止,还没有运气。我尝试过的所有其他解决方案均导致语法错误。
我正在尝试运行一条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:子查询返回的行不完全是一行。”
UPDATE inventory
SET location_id =
(SELECT location_id
FROM temp_inv
WHERE item_id=item_id)
答案 0 :(得分:1)
问题可能出在您的关联条件上。限定列名!
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
。
答案 1 :(得分:0)
使用联接查询:
UPDATE inventory i
INNER JOIN temp_inv it
ON i.item_id = it.item_id
SET i.location_id= it.location_id;
答案 2 :(得分:0)
您可以尝试这样的操作(请参见fiddle)。我选择PostgreSQL作为示例,因为Informix是Postgres稳定版的产品(Michael Stonebraker参与了这两个产品),而且我不了解Informix的小提琴。由于供应商之间的varying syntax,这些更新可能很棘手。
创建并填充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
等等! ps。欢迎来到论坛! :-)