これは SQL の専門家への質問です。SQL Server 2008 R2 を使用しています
関連する 2 つのテーブルがあります:Labs
とLabUsers
.
ユーザーは、任意の順序でグループ全体を繰り返すことなく、ラボに割り当てられます。
目標は、次のすべての制限を満たす@userName
ために (例では@user = "Paul"
)を挿入することです。LabUsers
グループ
@maxUsers
内のみ (例@maxUsers=4
)完全なグループ (完全なラボ)の重複はありません。グループ内のユーザーの順序は重要ではありません。[編集]
既存のラボが許可されていない場合は、新しいラボを作成 ( ) してから、超過しないように
INSERT
の行を挿入します (例)。@user
@maxLabs
@maxLabs=5
非常に重要: 1 秒間にサーバーから多数の同じ要求が同時に発生し、相互に干渉する可能性があります。したがって、コマンドの実行が開始されるとすぐに、このコマンドが終了するまで他のクエリを実行できなくなります。
上記の制限を満たさない場合、クエリは 0 を返し
LabID
、挿入された行の を返す必要があります。[編集済み]いくつかのラボのゾーンがあります。ゾーンは独立しています。各ゾーン #labCount は によって境界付けられます
@maxLabs
。は@maxLabs
すべてのゾーンで等しいため、Total_maxLabs
=@maxLabs
x#zonesCount
です。例については@zone=51
(後述@zone=52, 53 etc.
)。(同じ LabUsers は制限なしでゾーンを使用できます。ゾーンはお互いを「認識」しません)LabID
inLabUsers
は からの外部キーですLabs
。
例:
ここにLabs
表があります:
LabID LabName LabZone
----- ------- -------
1 North 51
2 North East 51
3 South West 51
そして、次のLabUsers
とおりです。
LabUserID LabUserName LabID
--------- ----------- -----
1 Diana 3
2 Julia 2
3 Paula 2
4 Romeo 1
5 Julia 3
6 Rose 2
7 Diana 1
8 Diana 2
9 Julia 1
10 Romeo 3
11 Paul 1
この例では、ユーザーは次のように割り当てられます。
LabID LabName LabZone LabUsers (ordered LTR a>z)
----- ------- ------- --------
1 North 51 Diana•Julia•Paul•Romeo
2 North East 51 Diana•Julia•Paula•Rose
3 South West 51 Diana•Julia•Romeo
LabID=1
これらのラボにはすでに 4 人のユーザーがいるため、挿入を 2 つにすることはできません。LabID=3
との複製が作成されているため、 への挿入は行われませんLabID=1
。
したがって、 は 3 ではないため(既存のラボ)、値を持つ に@maxLabs
新しい行を挿入する必要があります。Labs
LabZone=@zone=51
は、新しい行の を 4 に設定IDENTITY
します。LabID
新しいラボの挿入から戻ったばかりの状態で挿入するときがPaul
来ました。LabUsers
LabID
この問題を解決するには?
コマンドが干渉なく全体として実行されるようにするために使用する方法は何ですか?
データベースを作成するスクリプトは次のとおりです。
CREATE DATABASE [Allocation]
GO
USE [Allocation]
GO
CREATE TABLE [dbo].[LabUsers](
[LabUserID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED ,
[LabUserName] [nvarchar](50) NOT NULL,
[LabID] [int] NOT NULL)
GO
SET IDENTITY_INSERT [dbo].[LabUsers] ON
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (1, N'Diana', 3)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (2, N'Julia', 2)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (3, N'Paula', 2)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (4, N'Romeo', 1)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (5, N'Julia', 3)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (6, N'Rose', 2)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (7, N'Diana', 1)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (8, N'Diana', 2)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (9, N'Julia', 1)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (10, N'Romeo', 3)
INSERT [dbo].[LabUsers] ([LabUserID], [LabUserName], [LabID]) VALUES (11, N'Paul', 1)
SET IDENTITY_INSERT [dbo].[LabUsers] OFF
CREATE TABLE [dbo].[Labs](
[LabID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY CLUSTERED ,
[LabName] [nvarchar](50) NULL,
[LabZone] [int] NOT NULL)
GO
SET IDENTITY_INSERT [dbo].[Labs] ON
INSERT [dbo].[Labs] ([LabID], [LabName], [LabZone]) VALUES (1, N'North', 51)
INSERT [dbo].[Labs] ([LabID], [LabName], [LabZone]) VALUES (2, N'North East', 51)
INSERT [dbo].[Labs] ([LabID], [LabName], [LabZone]) VALUES (3, N'South West', 51)
SET IDENTITY_INSERT [dbo].[Labs] OFF