按对象计算单元格

时间:2010-06-07 14:37:31

标签: sql oracle select-insert

我又遇到了一个问题: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中的值是否已经存在 如果这是真的那么我需要为此Id使用下一个my_Num

我在表格中有这个:

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;

如果在子选择

中找不到行,则此选择返回null

有没有办法在这种情况下使用max?如果它返回null,它应该使用0或1?

编辑: 我现在用这个:

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对Bharat和OMG小马

迎接
AURO

3 个答案:

答案 0 :(得分: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>;

答案 1 :(得分: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

答案 2 :(得分:0)

所有解决方案都存在一个问题,即它们无法在多用户环境中运行。如果两个会话同时发出该insert语句,它们将获得相同的(my_id,my_num)组合,并且其中一个会因ORA-00001唯一约束违规而失败。因此,如果您需要在多用户环境中工作,最好的建议是只使用一个主键列并使用序列填充它。保留my_id列,因为它是一个分组列或外键列。如果您的最终用户真的希望在他们的(Web)应用程序中看到“my_num”列,则可以使用row_number分析函数。

您可以在我的博客中详细了解此方案:http://rwijk.blogspot.com/2008/01/sequence-within-parent.html

此致 罗布。