有没有办法通过重复 TableB 将 TableA 的每一行连接到较小的 TableB 的一行,但需要多次?

Rac*_*hel 8 sql-server-2005 query-refactor

抱歉,标题令人困惑,我不知道在那里写什么。

我有一张包含几百条记录的表格。我需要将这个表的每条记录分配给一个更小的动态用户表,并且用户应该交替分配他们被分配的记录。

例如,如果表A是

Row_Number() 标识
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10

表B是

Row_Number() 标识
1 1
2 2
3 3

我需要一个最终结果集

用户 ID 记录 ID
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
Run Code Online (Sandbox Code Playgroud)

UserIds 交替也很重要。我无法将记录的前 1/3 分配给 User1,将记录的第二个 1/3 分配给 User2,将记录的第 1/3 分配给 User3。

此外,UserIds 需要维护它们最初输入的顺序,这就是为什么我Row_Number() OVER (ORDER BY (SELECT 1))在 User's 表中有一个

有没有办法在单个查询中加入这些表,这样我就不需要使用临时表和变量?

我使用的是 SQL Server 2005

Lam*_*mak 12

避免临时表的另一种方法是:

;WITH tmpTest AS
(
    SELECT  Num as [UserId]
            , Row_Number() OVER (ORDER BY (SELECT 1)) as [RowNo]
            , COUNT(*) OVER() AS Quant
    FROM dbo.StringToNumSet('2,3,1', ',') 
)
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 % Quant) + 1;
Run Code Online (Sandbox Code Playgroud)


Jac*_*las 6

是的,您可以在没有任何临时表的情况下执行此操作:

with w as (select usr_id, row_number() over (order by usr_id) as usr_ordinal from usr)
select record_id, ( select usr_id
                    from w
                    where usr_ordinal=1+(record_ordinal%(select count(*) from w))
                  ) as usr_id
from ( select record_id, row_number() over (order by record_id) as record_ordinal 
       from record ) as z;
Run Code Online (Sandbox Code Playgroud)

这里的SQLFiddle演示

  • @Rachel 仅仅因为它是这样声明的,并不意味着它就是这样执行的。 (4认同)