【问题标题】:Counting a cell up per Objects每个对象计数一个单元格
【发布时间】:2010-06-07 14:37:31
【问题描述】:

我又遇到了一个问题: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

感谢 Bharat 和 OMG Ponies

问候
奥罗

【问题讨论】:

    标签: sql oracle select-insert


    【解决方案1】:

    试试这个

    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>;
    

    【讨论】:

    • 它确实有效,但如果 ID 不存在于表中,所有插入的行都将有一个 null
    • 我认为您必须将ID作为主键。
    • Id 是带有 my_Num 的集群 PK
    【解决方案2】:
    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
    

    【讨论】:

    • 在将源表复制到目标表时,如果我们使用该语句,即使源表中有多条记录,也只会在目标表中插入一条记录。
    • 然后,需要去掉where子句
    【解决方案3】:

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

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

    问候, 抢。

    【讨论】:

    • 嗯,这是一个好点!但是这个 SQL 语句只会被一个人使用,即使有更多的会话,它们也不会在同一个 ID 上工作(ID 类似于一个人的 ID,而 my_Num 是一个历史记录。我正在做的是将 2 个人合并在一起,这就是计算这个数字的原因)-顺便说一句,我不允许使用序列,我认为它对此不起作用,或者你想为每个 ID 做一个序列?问候,奥罗
    猜你喜欢
    • 2012-08-16
    • 2020-05-04
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多