首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Oracle中将子查询转换为单值

在Oracle中将子查询转换为单值
EN

Stack Overflow用户
提问于 2016-03-20 17:30:21
回答 2查看 210关注 0票数 0

我有一份地点清单。我需要在留言簿中为每个人插入一个备注。

我有以下代码:

代码语言:javascript
运行
复制
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中

EN

Stack Overflow用户

发布于 2016-03-20 17:39:09

您应该始终包括您得到的完整错误消息-在本例中,您在此部分中有几个错误:

代码语言:javascript
运行
复制
SELECT MAX(person_id) INTO my_id
       FROM Persons
       WHERE name LIKE 'My Name'
       GROUP BY person_id;

SQL语句的分号';‘标志着语句的结束-因为语句从下一行继续,所以如果您想要将

  • 语句的结果存储在PL/SQL变量中,则必须删除it
  • INTO my_id是必需的。因为它是更复杂语句的一部分,所以在这里没有意义,必须将其删除。
  • MAX(person_id)GROUP BY person_id一起使用是没有意义的;我假设您希望使用MAX(person_id)

最后,除非您想将其编写为循环,否则可以(也应该)将其重写为简单的INSERT语句:

代码语言:javascript
运行
复制
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子句中的列-这确保了如果将来将列添加到目标表中,代码仍然可以工作。

票数 0
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36112108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档