我有一份地点清单。我需要在留言簿中为每个人插入一个备注。
我有以下代码:
begin
for rec in (
SELECT p.place_id FROM Places p
WHERE p.place_id NOT IN(
SELECT DISTINCT v.place_id FROM Visits v
)
) loop
INSERT INTO Guestbook
VALUES (
rec.place_id,
(
SELECT MAX(person_id) INTO my_id
FROM Persons
WHERE name LIKE 'My Name'
GROUP BY person_id;
),
'My comment'
);
end loop;
end;问题是插入不起作用,因为它将子查询视为一个列。但是,即使我尝试对它调用MAX(),它也不会将其视为单个值。我需要该子查询只返回一个值,这样就可以将它插入到Guestbook中
发布于 2016-03-20 17:39:09
您应该始终包括您得到的完整错误消息-在本例中,您在此部分中有几个错误:
SELECT MAX(person_id) INTO my_id
FROM Persons
WHERE name LIKE 'My Name'
GROUP BY person_id;SQL语句的分号';‘标志着语句的结束-因为语句从下一行继续,所以如果您想要将
INTO my_id是必需的。因为它是更复杂语句的一部分,所以在这里没有意义,必须将其删除。MAX(person_id)与GROUP BY person_id一起使用是没有意义的;我假设您希望使用MAX(person_id)最后,除非您想将其编写为循环,否则可以(也应该)将其重写为简单的INSERT语句:
INSERT INTO Guestbook(place_id, person_id, comment)
SELECT
p.place_id,
(
SELECT MAX(person_id)
FROM Persons
WHERE name LIKE 'My Name'
GROUP BY name
),
'My comment'
FROM Places p
WHERE p.place_id NOT IN (
SELECT v.place_id FROM Visits v
);这更短,更清晰,效率更高。我还显式地枚举了INTO子句中的列-这确保了如果将来将列添加到目标表中,代码仍然可以工作。
https://stackoverflow.com/questions/36112108
复制相似问题