我又遇到了一个问题: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
答案 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
此致 罗布。