sql >> Databasteknik >  >> RDS >> Sqlserver

Identitetsliknande kolumn men baserad på Group By-kriterier

Jag håller med Sean - lägg till en identitetskolumn och använd sedan bara en beräknad kolumn för uppgifts-id. Även om jag har svarat på en fråga som liknar den här här, är jag inte säker på att markera denna som en dubblett. Anledningen till detta är att du vill använda task_id som en del av primärnyckeln.
Jag är dock inte säker på att det är möjligt, eftersom den måste vara persisted för att kunna inkludera en beräknad kolumn i primärnyckeln. , och av någon anledning (jag tror att det är på grund av användningen av en UDF) tillåter inte SQL Server mig att markera det som beständigt.
Här är i alla fall mitt förslag till lösning för detta:

Skapa först en funktion som beräknar uppgifts-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 

Skapa sedan tabellen med uppgifts-id som en beräknad kolumn:

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

Testa det nu:

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

SELECT *
FROM Tasks

Resultat:

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

Du kan se en livedemo på rextester.




  1. SQL-kommandot avslutades inte korrekt?

  2. CTE-fel:Typerna matchar inte mellan ankaret och den rekursiva delen

  3. ORACLE SQL*Plus handledning

  4. Måste deklarera den skalära variabeln