“子查询未完全返回一行”错误

时间:2019-11-02 04:13:39

标签: sql updates informix

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

我正在尝试运行一条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)

3 个答案:

答案 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。欢迎来到论坛! :-)