Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Колона, подобна на идентичност, но въз основа на критерии за групиране

Съгласен съм с Шон – добавете колона за самоличност и след това просто използвайте изчислена колона за идентификатора на задачата. Въпреки че отговорих на въпрос, много подобен на този тук, не съм сигурен дали да маркирате този като дубликат. Причината за това е, че искате да използвате task_id като част от първичния ключ.
Не съм сигурен обаче, че това е възможно, тъй като за да се включи изчислена колона в първичния ключ, тя трябва да бъде persisted , и по някаква причина (мисля, че е заради използването на UDF) SQL Server няма да ми позволи да го маркирам като постоянен.
Както и да е, ето предложеното от мен решение за това:

Първо, създайте функция, която ще изчисли идентификатора на задачата:

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 

След това създайте таблицата с идентификатора на задачата като изчислена колона:

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.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Дефиниране на връзка един към един в SQL Server

  2. Използване на SQL Server като хранилище за изображения

  3. съхранявате арабски в SQL база данни

  4. Как да преименувате нещо в SQL Server, което има квадратни скоби в името?

  5. Разбиране на важността на настройката на паметта в SQL Server