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_Id1 添加一行,该行将如下所示:我的表中有这个:

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;

如果在子选择中未找到任何行,则此 Select 将返回 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 小马

迎接
奥罗

4

3 回答 3

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>;
于 2010-06-07T14:45:22.427 回答
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
于 2010-06-07T14:46:21.537 回答
0

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

您可以在我的这篇博文中了解更多关于这种情况的信息:http ://rwijk.blogspot.com/2008/01/sequence-within-parent.html

问候,罗布。

于 2010-06-09T06:41:39.570 回答