ショーンに同意します-ID列を追加してから、タスクIDに計算列を使用します。ここでこのような質問に非常によく答えましたが、これを重複としてマークするかどうかはわかりません。これは、task_id
を使用するためです。 主キーの一部として。
ただし、主キーに計算列を含めるには、persisted
する必要があるため、それが可能かどうかはわかりません。 、および何らかの理由で(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
rextesterでライブデモを見ることができます。