连接表(没有子句)

Raj*_*ore 0 sql t-sql sql-server sql-server-2005

我想加入表并获得以下输出

表格1

TestId1
----------
one
two
three
four
five
six
seven
eight
Run Code Online (Sandbox Code Playgroud)

表2

TestId2
----------
fiftythree
fiftyfour
fiftytwo
fiftyfive
fiftyone
Run Code Online (Sandbox Code Playgroud)

我希望Table3作为我的输出,包含table1中的所有行和table2中的第一行,直到没有剩下的行,然后它们应该开始重复.

作为替代答案,它们也可以随机分配.

TestId1        TestId2   
----------     ----------
one           fiftythree
two           fiftyfour 
three         fiftytwo  
four          fiftyfive 
five          fiftyone  
six           fiftythree
seven         fiftyfour 
eight         fiftytwo  
Run Code Online (Sandbox Code Playgroud)

Luk*_*sik 5

试试这个:

SELECT t1.name, t2.name FROM
(
    SELECT (ROW_NUMBER() OVER(ORDER BY name)-1)%(SELECT COUNT(*) FROM test2) AS j,* 
    FROM test1
) t1
INNER JOIN 
(
    SELECT ROW_NUMBER() OVER(ORDER BY name)-1 AS j,* 
    FROM test2
) t2 ON t1.j = t2.j
ORDER BY t1.name
Run Code Online (Sandbox Code Playgroud)

详情如下:

SELECT (ROW_NUMBER() OVER(ORDER BY name)-1) AS j,* 
FROM test1
Run Code Online (Sandbox Code Playgroud)

返回:

0 | one
1 | two
2 | three
3 | four
4 | five
5 | six
6 | seven
7 | eight
Run Code Online (Sandbox Code Playgroud)

这个:

SELECT ROW_NUMBER() OVER(ORDER BY name)-1 AS j,* 
FROM test2
Run Code Online (Sandbox Code Playgroud)

返回:

0 | fiftythree
1 | fiftyfour
2 | fiftytwo
3 | fiftyfive
4 | fiftyone
Run Code Online (Sandbox Code Playgroud)

您所要做的就是将最长表的第一列除以(更简楚的是 - 我不知道这个的英文名称)中的元素数量:

SELECT (ROW_NUMBER() OVER(ORDER BY name)-1)%(SELECT COUNT(*) FROM test2) AS j,* 
FROM test1
Run Code Online (Sandbox Code Playgroud)

返回:

0 | one
1 | two
2 | three
3 | four
4 | five
0 | six
1 | seven
2 | eight
Run Code Online (Sandbox Code Playgroud)

您现在要做的就是在第一列上连接两个表.

此解决方案仅使用一个查询,但它假定在table1中,table2中有更多元素.如果你不喜欢这个解决方案,我只是给你很好的基础来编写商店程序.