使用INSERT INTO SELECT时ORA 00937

时间:2013-04-10 12:59:30

标签: sql oracle oracle10g oracle11g

当我在select语句中运行下面的insert时,我得到ORA 00937因为下面的查询无法处理APPLICATIONS表上的一个子选择。我不想硬编码这个值。有什么建议吗?

提前致谢。

insert into CONFIGURATION_PARAMETER_VALUES
( ID
, NAME
, DESCRIPTION
, DATA_TYPE
, VALUE_STRING
, VALUE_INTEGER
, VALUE_DATE
, VALUE_FLOAT
, VALUE_TIMESTAMP
, APPLICATION_ID
, DELETED
) 
select NVL(MAX(ID),0)+1
       , 'Alert_Statuses_AllExceptNoStatus'
       , 'Suspicious'
       , 'String'
       , 'RBS_EIM_AL_008'
       , null
       , null
       , null
       , null
       , (select ID from APPLICATIONS where name = 'Rabobank v 1.0.0.0')
       , 'N'
  from CONFIGURATION_PARAMETER_VALUES

2 个答案:

答案 0 :(得分:1)

如果还不晚,我建议实施SEQUENCE而不是计算。您可能无法获得严格的数字顺序(可能存在间隙),但每次都会得到一个唯一值:

CREATE SEQUENCE Config_Parm_Values_Seq START WITH <1 + your current max ID>;

另请注意,您现在的INSERT表现如下:

  • 如果表格中没有记录,则不会插入任何记录。
  • 如果表中有记录,每次执行时它会使表中的行数加倍。

因此,即使您不使用序列,我也会考虑使用“普通旧”INSERT而不是INSERT ... SELECT。此示例使用序列:

insert into CONFIGURATION_PARAMETER_VALUES
( ID
, NAME
, DESCRIPTION
, DATA_TYPE
, VALUE_STRING
, VALUE_INTEGER
, VALUE_DATE
, VALUE_FLOAT
, VALUE_TIMESTAMP
, APPLICATION_ID
, DELETED
) VALUES (
       Config_Parm_Values_Seq.NEXTVAL -- Use seqname.nextval to get
                                      -- the next value from the sequence
       , 'Alert_Statuses_AllExceptNoStatus'
       , 'Suspicious'
       , 'String'
       , 'RBS_EIM_AL_008'
       , null
       , null
       , null
       , null
       , (select MAX(ID) from APPLICATIONS where name = 'Rabobank v 1.0.0.0')
       , 'N')

答案 1 :(得分:0)

问题出在您使用SELECT的{​​{1}}语句中。 当您在SELECT NVL(MAX(ID), 0) + 1列表中使用MAX函数时,必须使用SELECT,这不是此处的解决方案。

使用以下内容:

GROUP BY