抱歉,标题令人困惑,我不确定在那里写什么。
我有一张包含数百条记录的表格。我需要将此表的每条记录分配给一个小得多的动态用户表,用户应该轮流分配给他们的记录。
例如,如果表 A 是
Row_Number() ID 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 9 9 10 10
表B是
Row_Number() ID 1 1 2 2 3 3
我需要一个最终结果集
UserId RecordId 1 1 2 2 3 3 1 4 2 5 3 6 1 7 2 8 3 9 1 10
我设法使用 mod 运算符做了一些有点混乱的事情,但我很好奇是否可以在没有临时表和变量的情况下运行相同的查询。
使用临时表是因为 TableA 实际上是一个用户定义函数,它将逗号分隔的字符串转换为表,我需要 UDF 中的对象计数。
-- Converts a comma-delimited string into a table
SELECT Num as [UserId], Row_Number() OVER (ORDER BY (SELECT 1)) as [RowNo]
INTO #tmpTest
FROM dbo.StringToNumSet('2,3,1', ',')
DECLARE @test int
SELECT @test = Count(*) FROM #tmpTest
SELECT *
FROM #tmpTest as T1
INNER JOIN (
SELECT Top 10 Id, Row_Number() OVER (ORDER BY SomeDateTime) as [RowNo]
FROM TableA WITH (NOLOCK)
) as T2 ON T1.RowNo = (T2.RowNo % @test) + 1
UserIds 也交替使用很重要。我无法将记录的前 1/3 分配给 User1,将记录的第二个 1/3 分配给 User2,将记录的第三个 1/3 分配给 User3。
此外,UserIds 需要保持它们最初输入的顺序,这就是为什么我Row_Number() OVER (ORDER BY (SELECT 1))
在用户表中有一个
有没有一种方法可以在单个查询中连接这些表,这样我就不需要使用临时表和变量了?
我正在使用 SQL Server 2005
避免临时表的另一种方法是:
是的,您可以在没有任何临时表的情况下执行此操作:
请在此处查看 SQLFiddle 演示