Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Kolom mirip identitas tetapi berdasarkan kriteria Kelompokkan

Saya setuju dengan Sean - tambahkan kolom identitas, lalu gunakan kolom yang dihitung untuk id tugas. Meskipun saya telah menjawab pertanyaan seperti ini di sini, saya tidak yakin untuk menandai yang ini sebagai duplikat. Alasannya adalah karena Anda ingin menggunakan task_id sebagai bagian dari kunci utama.
Namun, saya tidak yakin itu mungkin, karena untuk memasukkan kolom yang dihitung dalam kunci utama harus persisted , dan untuk beberapa alasan (saya pikir itu karena penggunaan UDF) SQL Server tidak mengizinkan saya untuk menandainya sebagai bertahan.
Bagaimanapun, inilah solusi yang saya usulkan untuk ini:

Pertama, buat fungsi yang akan menghitung id tugas:

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 

Kemudian, buat tabel dengan id tugas sebagai kolom yang dihitung:

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

Sekarang, ujilah:

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

SELECT *
FROM Tasks

Hasil:

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

Anda dapat melihat demo langsung di 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. KOTAK () Contoh di SQL Server

  2. Apa saja Jenis Kendala yang Tersedia di SQL Server - Tutorial SQL Server / T-SQL Bagian 50

  3. Cara Memilih Sejumlah Karakter dari Kiri atau Kanan String di SQL Server

  4. Bagaimana cara saya menulis .Skip(1000).Take(100) LINQ dalam SQL murni?

  5. Ekspor data kueri SQL ke Excel