Tsql 如何在T-SQL中将一个用户随机分配给另一个用户?

Tsql 如何在T-SQL中将一个用户随机分配给另一个用户?,tsql,random,Tsql,Random,我正在尝试编写一个存储过程,它将获取一个用户表,并随机地将它们分配给彼此,没有重复项,也没有人分配给自己 用户表有一个UserId列和一个Username列。我有一个单独的表来存储ID。该表有一个UserId列和一个AssignedUserId列 我使用此代码段对行进行随机排序: SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber] 当上面的代码是select的一部分时,它可以正常工作。作为一个数据集,我很难

我正在尝试编写一个存储过程,它将获取一个用户表,并随机地将它们分配给彼此,没有重复项,也没有人分配给自己

用户表有一个UserId列和一个Username列。我有一个单独的表来存储ID。该表有一个UserId列和一个AssignedUserId列

我使用此代码段对行进行随机排序:

SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)) AS [RandomNumber]
当上面的代码是select的一部分时,它可以正常工作。作为一个数据集,我很难思考。我可以逐行或用C#解决这个问题,但我希望有一位SQL专家能告诉我如何在一个漂亮、高效的查询中实现这一点


谢谢

这是可以做到的,但在大桌子上不是很好的做法,但由于你的桌子太小,这将非常有效

DECLARE @A TABLE (A1 INT, A2 INT)

INSERT INTO @A VALUES(1, 1)
INSERT INTO @A VALUES(2, 2)
INSERT INTO @A VALUES(3, 3)
INSERT INTO @A VALUES(4, 4)
INSERT INTO @A VALUES(5, 5)

SELECT * FROM @A ORDER BY NEWID()

Result1: 
3   3
1   1
4   4
5   5
2   2

Result2:
2   2
3   3
4   4
5   5
1   1

Result3:
4   4
3   3
1   1
5   5
2   2

Result4:
3   3
5   5
1   1
4   4
2   2

Result5:
5   5
4   4
1   1
3   3
2   2

好的,这是我同时提出的另一个解决方案。我认为用户已经以随机顺序出现在系统中,所以也许我应该尝试一种解码器环样式的方法。因此,这段代码生成一个移位值,然后将用户ID移位。select语句使用公式进行“换行”。这不是完全随机的,它可以使用一些抛光剂,但这就是我所拥有的。用户可能不会意识到随机性的缺乏。谢谢你的帮助

DECLARE @people TABLE 
( 
    id INT, 
    name VARCHAR(50)
)

INSERT INTO @people VALUES (1,'Matthew')
INSERT INTO @people VALUES (2,'Mark')
INSERT INTO @people VALUES (3,'Luke')
INSERT INTO @people VALUES (4,'John')
INSERT INTO @people VALUES (5,'Doug')
INSERT INTO @people VALUES (6,'Jamie')
INSERT INTO @people VALUES (7,'John')
INSERT INTO @people VALUES (8,'Cameron')
INSERT INTO @people VALUES (9,'Emily')
INSERT INTO @people VALUES (10,'Tyler')
INSERT INTO @people VALUES (11,'Todd')
INSERT INTO @people VALUES (12,'Kathryn')

DECLARE @Random INT;
DECLARE @Upper INT;
DECLARE @Lower INT;
DECLARE @MaxId INT;

SET @Lower = 1 -- The lowest record ID

SELECT @Upper = (MAX(Id) / 2) FROM @people -- select random int that is somewhere between 1 and half of max ID for shift
SELECT @MaxId = MAX(Id) FROM @people -- select the largest ID in the table

SELECT @Random = ROUND(((@Upper - @Lower -1) * RAND() + @Lower), 0) -- calculate a random number to shift IDs off by

SELECT id, ((id + @Random) % @MaxId) + 1, @Random
from @people

不定义重复项。是否要分配(更新)AssignedUserId列?如果没有重复,则可能是重复的。我的意思是,每个配对都应该是唯一的,并且不应将任何人分配给他们自己。@Pondlife您是对的!这正是我想做的。谢谢你的链接!如果系统今天上线,用户应该少于100人。它是一个内部应用程序。使用我得到的NEWID()进行选择。我无法将我的想法集中在将表连接到自身或临时表或任何东西上,然后让服务器找出这些对。你能发布一个示例吗?Order By NewID()可以处理如此少量的数据。is所做的是随机排列每一列,即使你有两列。我在寻找这样的结果:1-3,2-4,9-7,但不是3-3或1-2,3-2(2不应该配对两次)。我不确定你是否打算这样做,但你随机挑选的只是小组的上半部分。如果你想让每个人随机化,“上-下-1”应该是,仅仅是上。