gpt4 book ai didi

sql - 类似身份的列,但基于分组条件

转载 作者:行者123 更新时间:2023-12-03 02:26:52 25 4
gpt4 key购买 nike

在我的 SQL Server 2012 数据库中,我正在创建一个“任务”表,该表将具有由三个字段组成的复合主键:

Issue_ID [int] NOT NULL,
Issue_Sub_ID [int] NOT NULL,
Task_ID [int] NOT NULL

Issue_IDIssue_Sub_ID 是其他表的外键。在我创建的表中,可以有许多与每个 Issue_ID/Issue_Sub_ID 组合关联的任务。

我想要做的是为 Task_ID 列建立一个默认值,类似于我使用 IDENTITY(1,1) 的情况,但这会自动基于 Issue_ID/Issue_Sub_ID 组递增。例如,给定提供的 Issue_ID/Issue_Sub_ID 值,Task_ID 结果将如下所示:

Issue_ID     Issue_Sub_ID     Task_ID
======== ============ =======
12345 1 1
12345 1 2
12345 1 3
12345 2 1
12345 2 2
67890 2 1
67890 2 2
67890 2 3

我熟悉 ROW_NUMBER() OVER(PARTITION BY Issue_ID, Issue_Sub_ID ORDER BY Issue_ID, Issue_Sub_ID) 可能的解决方案,但是,因为我希望此列成为复合的一部分表的主键,我认为这不起作用。

提前感谢大家。

最佳答案

我同意 Sean 的观点 - 添加一个标识列,然后只使用计算列作为任务 ID。尽管我已经回答了一个非常像这个问题的问题here ,我不确定是否将其标记为重复项。原因是您希望使用 task_id 作为主键的一部分。
但是,我不确定这是否可能,因为为了在主键中包含计算列,它必须被持久化,并且出于某种原因(我认为这是因为使用了 UDF) SQL Server 不允许我将其标记为持久。
无论如何,这是我建议的解决方案:

首先,创建一个计算任务 ID 的函数:

CREATE FUNCTION dbo.GenerateTaskId
(
@Row_Id int,
@Issue_Id int,
@Issue_Sub_Id int
)
RETURNS Int
AS
BEGIN

RETURN
(
SELECT COUNT(*)
FROM dbo.Tasks
WHERE Issue_Id = @Issue_Id
AND Issue_Sub_ID = @Issue_Sub_ID
AND Row_Id <= @Row_Id
)
END
GO

然后,创建一个表,其中任务 ID 作为计算列:

CREATE TABLE dbo.Tasks
(
Row_Id [int] IDENTITY(1,1),
Issue_ID [int] NOT NULL,
Issue_Sub_ID [int] NOT NULL,
Task_Id AS dbo.GenerateTaskId(Row_Id, Issue_Id, Issue_Sub_Id),
CONSTRAINT PK_Tasks PRIMARY KEY (Row_Id)
)
GO

现在,测试一下:

INSERT INTO Tasks VALUES
(12345, 1),
(12345, 1),
(12345, 1),
(12345, 2),
(12345, 2),
(67890, 2),
(67890, 2),
(67890, 2)

SELECT *
FROM Tasks

结果:

Row_Id  Issue_ID    Issue_Sub_ID    Task_Id
1 12345 1 1
2 12345 1 2
3 12345 1 3
4 12345 2 1
5 12345 2 2
6 67890 2 1
7 67890 2 2
8 67890 2 3

You can see a live demo on rextester.

关于sql - 类似身份的列,但基于分组条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45693053/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com