sql >> Database >  >> RDS >> Sqlserver

Identiteitsachtige kolom maar gebaseerd op Group By-criteria

Ik ben het eens met Sean - voeg een identiteitskolom toe en gebruik dan gewoon een berekende kolom voor de taak-ID. Hoewel ik hier een vraag heb beantwoord die erg op deze lijkt, weet ik niet zeker of ik deze als een duplicaat moet markeren. De reden hiervoor is dat je de task_id . wilt gebruiken als onderdeel van de primaire sleutel.
Ik weet echter niet zeker of dat mogelijk is, omdat om een ​​berekende kolom in de primaire sleutel op te nemen, deze persisted , en om de een of andere reden (ik denk dat het komt door het gebruik van een UDF) laat SQL Server me niet toe om het als persistent te markeren.
Hoe dan ook, hier is mijn voorgestelde oplossing hiervoor:

Maak eerst een functie die de taak-ID berekent:

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 

Maak vervolgens de tabel met de taak-ID als een berekende kolom:

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

Test het nu:

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

SELECT *
FROM Tasks

Resultaten:

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

Je kunt een live demo zien op rextester.




  1. Omgaan met grote datavolumes met MySQL en MariaDB

  2. Testen van Android SQLite-database-eenheden

  3. Plezier met berichten

  4. MySQL onjuist sleutelbestand voor tmp-tabel bij het maken van meerdere joins