2010-06-07 151 views
0

我再次遇到問題:D 有點信息優先: 即時嘗試將數據從一個表複製到另一個表(結構相同)。 現在需要增加一個單元,每個單元在1處開始(就像歷史一樣)。每個對象計數一個對象

我有這個表:

create table My_Test/My_Test2 (
my_Id Number(8,0), 
my_Num Number(6,0), 
my_Data Varchar2(100)); 

(添加my_id,my_Num是一個嵌套PK)

如果我想插入新行,我需要檢查,如果在my_id值已經存在。
如果這是真的,那麼我需要使用下一個my_Num這個Id。

我有這個在我的表:

My_Id My_Num My_Data 
1  1   'test1' 
1  2   'test2' 
2  1   'test3' 

如果我現在連續加爲my_Id 1,行是這樣的:

My_Id My_Num My_Data 
1  3   'test4' 

: 我在我的表有這樣的這聽起來很容易,現在我需要使它在一個SQL 和SQL Server上我有同樣的問題,我用這個:

Insert Into My_Test (My_Id,My_Num,My_Data) 
SELECT my_Id, 
    (
    SELECT 
     CASE (
      CASE MAX(a.my_Num) 
      WHEN NULL 
      THEN 0 
      Else Max(A.My_Num) 
      END) + b.My_Num 
     WHEN NULL 
     THEN 1 
     ELSE (
      CASE MAX(a.My_Num) 
      WHEN NULL 
      THEN 0 
      Else Max(A.My_Num) 
      END) + b.My_Num 
     END 
    From My_Test A 
    where my_id = 1 
) 
    ,My_Data 
From My_Test2 B 
where my_id = 1; 
01如果沒有行被子選擇

發現

這個選擇給空回有沒有辦法讓我的情況下使用最大?如果它返回null應該使用0或1?

編輯: 林usung現在這個:

Insert INTO My_Test (My_Id,My_Num,My_Data) 
SELECT B.My_Id, 
    (
    SELECT COALESCE(MAX(a.My_Num),0) + b.my_Num 
    FROM My_Test A 
    Where a.My_Id = b.My_Id) 
    ,b.My_Data 
FROM My_Test2 B 
WHERE My_Id = 1 

THX到巴拉特和OMG小馬

迎接
AURO

回答

0

試試這個

Insert Into My_Test (My_Id,My_Num,My_Data) 
SELECT my_Id,(
    SELECT MAX(NVL(My_Num,0)) + 1  
    From My_Test 
    where my_id = b.my_id 
) 
,My_Data 
From My_Test2 B 
where my_id = <your id>; 
+0

它確實有效,但是如果表中不存在ID,所有插入的行都會有'null' – domiSchenk 2010-06-08 06:57:20

+0

我認爲您必須將ID作爲主鍵。 – Bharat 2010-06-08 07:21:40

+0

Id是具有my_Num的羣集PK – domiSchenk 2010-06-08 08:50:14

0
Insert Into My_Test (My_Id,My_Num,My_Data) 
select My_id,coalesce(max(My_num),0),'test4' from My_Test 
where My_id=1 
group by My_id 
+0

將源表複製到目標表時,如果我們使用此語句,即使源表中有多個記錄,它也只會在目標表中插入一條記錄。 – Bharat 2010-06-07 15:07:56

+0

然後,你需要刪除where子句 – Madhivanan 2010-06-08 07:23:42

0

所有解決方案都存在問題,因爲它們不適用於多用戶環境。如果兩個會話同時發出該插入語句,它們都會得到相同的(my_id,my_num)組合,並且其中一個會失敗並導致違反ORA-00001的唯一約束。因此,如果您需要在多用戶環境中工作,最好的建議是隻使用一個主鍵列並用序列填充它。保留你的my_id列,因爲這是一個分類列或外鍵列。如果您的最終用戶真的想在他們的(web)應用程序中看到「my_num」列,則可以使用row_number分析函數。

你可以閱讀更多有關此方案在本博文雷:http://rwijk.blogspot.com/2008/01/sequence-within-parent.html

問候, 羅布。

+0

那麼這是一個好點!但是這個SQL語句只能從一個人那裏使用,即使有更多的會話他們也不會在同一個ID上工作(ID就像是一個人的ID,my_Num是一個歷史記錄,我正在做的是合併2人的在一起,這就是爲什麼這個數字) - 而順便說一句,我不允許使用序列,我認爲這不適用於此,或者你想要爲每個ID做序列? 問候,Auro – domiSchenk 2010-06-09 06:53:42

相關問題