我有一个包含4列ID,c1,c2和LOT的表。 ID是主键。对于c1为5时的每条记录,我想为LOT自动生成一个数字,对于c2的每个不同值,它将是从1开始的序列。
因此,如果c1不是5,则LOT保持为空。但是如果c1是5那么对于c2 = 1的每个记录,我想用从1开始的自动递增序列填充LOT。 例如:
ID c1 c2 LOT
1 3
2 5 1 1
3 5 1 2
4 5 1 3
5 4
然后对c2的不同值执行相同操作。因此,如果c2为2,则从1开始有另一堆自动递增的LOT数字:
ID c1 c2 LOT
6 3
7 5 2 1
8 5 1 4
9 5 2 2
10 5 2 3
我们正在使用MSSQL 2014 Enterprise Ed。表分区是否有用,或者我是否需要为C2的每个不同值创建特殊表?
答案 0 :(得分:1)
没有身份字段,您可以使用触发器。
答案 1 :(得分:1)
使用身份功能无法做到这一点,但是,请考虑使用Instead of trigger手动管理您想要的值。
答案 2 :(得分:0)
您可以使用逻辑在查询或视图中生成LOT:
SELECT ID, C1, C2,
CASE
WHEN C1<>5 OR C2 IS NULL THEN NULL
ELSE COUNT(*) OVER (PARTITION BY C1, C2 ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
END AS LOT
FROM D
ORDER BY ID
给定一个用(ID,C1,C2)生成的表:
CREATE TABLE D (ID INT PRIMARY KEY IDENTITY, C1 INT, C2 INT)
INSERT D VALUES (3,NULL),
(5,1),
(5,1),
(5,1),
(4,NULL),
(3,NULL),
(5,2),
(5,1),
(5,2),
(5,2)
查询产生上面指出的输出:
ID C1 C2 LOT
1 3
2 5 1 1
3 5 1 2
4 5 1 3
5 4
6 3
7 5 2 1
8 5 1 4
9 5 2 2
10 5 2 3
用于生成LOT
,COUNT(*) OVER (PARTITION BY C1, C2 ORDER BY ID ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
的语句只计算在C1和C2等于当前行的当前行之前和之后的行数。例如,对于第4行,元组(c1,c2)=(5,1)在3行(包括该行)(第2,3和4行)中被观察到,因此LOT = 3。
答案 3 :(得分:0)
感谢大家提出使用触发器的建议(全部投票)。事实证明(正如我在上面的评论中提到的),侧栏上出现的文章(SQL Server unique auto-increment column in the context of another column)显示了正确的INSTEAD OF INSERT触发器的详细构造。作者提到它是“未经测试”,确实存在轻微错误(WITH子句中缺少GROUP BY ParentEntityID)但是任何复制代码的人都会得到一个明显需要修复的错误。可能不会犹豫在这里纠正这个帖子,但另一个问题是6岁。