【问题标题】:Trouble performing a SQL insert using selects where more than 1 row is to be inserted在要插入多于 1 行的地方使用 select 执行 SQL 插入时出现问题
【发布时间】:2014-03-10 15:53:47
【问题描述】:

我不是最强的 SQL 开发人员(有点新),但我认为我可以做我想做的事情,但我收到了一个错误。

基本上,我正在尝试根据一些选择执行批量插入。下面语句中第一个 select 的值返回 1 个 groupid,但第二个语句返回几百个 requestcategory id。我正在尝试使用以下语句执行这几百个插入:

INSERT
INTO M_GROUPREQUESTCATEGORY
(
    GROUPID,
    REQUESTCATEGORYID
)
VALUES
(
    (select groupid from esaws.m_group where name = 'Administration Group'),
    (select requestcategoryid from esaws.m_grouprequestcategory where groupid = (select groupid from esaws.m_group where name = 'Customer Service Group'))
);

我的问题是,SQL 返回以下错误:

错误报告 -
SQL 错误:ORA-01427:单行子查询返回多于一行
01427. 00000 - “单行子查询返回多于一行”
*原因:
*行动:

有人可以向我解释我做错了什么,以及我需要改变什么才能使它正常工作吗?

编辑:明确地说,我试图想出一种方法,不必编写几百个单独的插入。

【问题讨论】:

  • 错误非常明显。您试图在只允许返回一行数据但返回 2 行以上的上下文中使用子选择。由于您在那里有 3 个子选择,这是我们可以提供的最接近的帮助。
  • 我明白这一点,但我想我要问的是,我如何改变我的查询来让它做我想做的事情
  • 好吧,我们帮不了你。我们不知道您的子查询在做什么。您必须弄清楚这 3 个子选择中的哪一个正在/正在返回多行。
  • 如果子查询返回多行 - 你想做什么?您应该尝试编写一个单独的 select 语句来返回您想要首先插入的结果。
  • Marc,如果您阅读我在原帖中写的内容,您会看到我告诉您第一个选择返回 1 个 groupid,但第二个选择返回多个请求类别。

标签: sql oracle insert


【解决方案1】:

我怀疑这就是你想要的:

INSERT
INTO M_GROUPREQUESTCATEGORY
(
    GROUPID,
    REQUESTCATEGORYID
)
select      DISTINCT G.groupid, R.requestcategoryid 
from        esaws.m_group G
Cross Join  esaws.m_grouprequestcategory R
where       G.name = 'Administration Group'
and         R.groupid = (
                select groupid 
                from esaws.m_group 
                where name = 'Customer Service Group')
and NOT EXISTS(Select * From esaws.m_grouprequestcategory R2
               Where  R2.GroupID = G.GroupID
               And    R2.requestcategoryid = R.requestcategoryid)
;

如果我理解正确的话,这基本上是将所有请求类别从“客户服务组”复制到“管理组”。

【讨论】:

  • 谢谢巴里。当我尝试运行它时,我得到“SQL 命令未正确结束”。我看不到我们遗漏了什么.....
  • 我试图让它运行,但我不明白为什么它认为它没有正确结束
  • @user3394338 我也在 SQL Fiddle 中得到它,不知道为什么。我将尝试将其作为一个单独的问题提出......
  • @user3394338 你用什么在Oracle中执行这些命令?感觉这可能是接口问题。
  • 我正在使用 Sql Developer 4.0。这是我们在工作中唯一使用的东西
【解决方案2】:

select 语句中的子查询必须计算为单个值,否则您将收到此错误。这是有道理的,因为您希望填充一个字段的值。

所以当你说'但是第二条语句返回几百个请求类别 ID'时,那就是那里的错误。每个结果只需要 1 个。

【讨论】:

  • ss781:我试图避免编写数百个插入,并尝试在 1 个语句中完成。我所做的显然是错误的,但我无法弄清楚我需要做什么才能不必编写数百个插入
  • SS781 - 这不应该是一个答案,而是一个评论。
【解决方案3】:

交叉连接的简单方法

我理解您的要求的方式是 - 您希望将所有 groupIds 从管理组复制到客户服务组 - 基于您希望进行跨表连接。

INSERT INTO  schema.tgt_table_name 
    WITH groupid AS
         (SELECT groupid
            FROM esaws.m_group
           WHERE NAME = 'Administration Group'),
         requestcategoryid AS
         (SELECT requestcategoryid
            FROM esaws.m_grouprequestcategory
           WHERE groupid = (SELECT groupid
                              FROM esaws.m_group
                             WHERE NAME = 'Customer Service Group'))
    SELECT groupid.groupid, requestcategoryid.requestcategoryid
      FROM groupid, requestcategoryid

【讨论】:

  • Sandeep:您提供的代码返回了我想要准确插入的数百条记录。但是,我的问题是,我如何获取上面的查询返回的内容,并将它们更改为 INSERTS 而不是在屏幕上显示?
  • 添加了插入语句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 2011-07-19
  • 2014-07-11
  • 1970-01-01
  • 2023-03-07
相关资源
最近更新 更多