2013-04-10 75 views
-1

當我運行下面的插入select語句時,我得到ORA 00937,因爲下面的查詢無法處理APPLICATIONS表中的一個子選擇。我不想硬編碼這個值。有什麼建議麼?ORA 00937同時使用INSERT INTO SELECT

在此先感謝。

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 
+0

有可能您的子查詢返回多個值。所以,試試你的子查詢是這樣的 從APPLICATIONS中選擇MAX(ID)where name ='Rabobank v 1.0.0.0' – IndoKnight 2013-04-10 13:08:53

回答

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') 
+0

這也是一個有用的解決方案。唯一令我懷疑的是關於序列的使用。這是使用序列的理想選擇。但是,填充表格後,我不知道這將如何工作。即使用戶執行了「SELECT MAX(ID)+1 FROM ...」,查詢也會返回一個錯誤。 – Rachcha 2013-04-10 14:09:38

+0

Thanks @Rachcha - 我同意你的評價,即序列是理想的,儘管它可能不太適合。我確定'SELECT MAX(ID)+1 ...'可以被調試並且可以工作,可能帶有一個'NVL'或者一些其他的後備。然後,如果有多個用戶試圖運行非 - 序列'INSERT'在同一時間,會導致一個重複的ID?我一直使用序列,所以我不知道會發生什麼。 – 2013-04-10 14:23:54

+0

@Rachcha - 感謝'NEXTVAL'的新聞。對我而言,我想我需要另一杯咖啡:)我試圖接受你的改變,但不知道如何改變,所以我只是用手工輸入。再一次,謝謝。 – 2013-04-10 14:39:09

0

的問題是在你的SELECT聲明中,你正在使用SELECT NVL(MAX(ID), 0) + 1。 如您在SELECT列表中使用MAX函數,您必須使用GROUP BY,這不是此處的解決方案。

使用類似以下內容:

insert into CONFIGURATION_PARAMETER_VALUES 
(ID 
, NAME 
, DESCRIPTION 
, DATA_TYPE 
, VALUE_STRING 
, VALUE_INTEGER 
, VALUE_DATE 
, VALUE_FLOAT 
, VALUE_TIMESTAMP 
, APPLICATION_ID 
, DELETED 
) 
select (SELECT MAX(ID) FROM configuration_parameter_values) + 1 
     -- above line instead of NVL(MAX(ID),0)+1 
     -- You can also put NVL function around the subquery. 
     , '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') 
     -- Warning: The above subquery can generate a TOO_MANY_ROWS exception. 
     -- Use the solution in the other answer to avoid this. 
     , 'N' 
    from CONFIGURATION_PARAMETER_VALUES 
+0

嘿,謝謝你的回覆,但是你的查詢正在給ORA-00001:唯一約束(CFG_PARAM_VAL_PK)違犯 – user2263807 2013-04-10 13:20:27

+0

這是在'CONFIGURATION_PARAMETER_VALUES.ID'列嗎? – Rachcha 2013-04-10 13:30:10

+0

或者你可以嘗試'SELECT NVL((SELECT MAX(ID)+1 FROM configuration_parameter_values),1)' – Rachcha 2013-04-10 13:31:59