Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Identitätsähnliche Spalte, aber basierend auf Gruppieren nach-Kriterien

Ich stimme Sean zu - fügen Sie eine Identitätsspalte hinzu und verwenden Sie dann einfach eine berechnete Spalte für die Aufgaben-ID. Obwohl ich hier eine Frage sehr ähnlich beantwortet habe, bin ich mir nicht sicher, ob ich diese als Duplikat markieren soll. Der Grund dafür ist, dass Sie die task_id verwenden möchten als Teil des Primärschlüssels.
Ich bin mir jedoch nicht sicher, ob das möglich ist, da eine berechnete Spalte, um sie in den Primärschlüssel aufzunehmen, persisted sein muss , und aus irgendeinem Grund (ich denke, es liegt an der Verwendung einer UDF) erlaubt mir SQL Server nicht, sie als dauerhaft zu markieren.
Wie auch immer, hier ist mein Lösungsvorschlag dafür:

Erstellen Sie zuerst eine Funktion, die die Aufgaben-ID berechnet:

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 

Erstellen Sie dann die Tabelle mit der Aufgaben-ID als berechnete Spalte:

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

Jetzt testen:

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

SELECT *
FROM Tasks

Ergebnisse:

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

Sie können eine Live-Demo auf rextester sehen.