Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将表A中的每一行与表B中的一行相关联,环绕_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 将表A中的每一行与表B中的一行相关联,环绕

Sql 将表A中的每一行与表B中的一行相关联,环绕,sql,sql-server,tsql,Sql,Sql Server,Tsql,我想用另外两个表中的数据组合创建一个表。假设表1如下所示: A B C D E F X Y Z A X B Y C Z D X E Y F Z 表二是这样的: A B C D E F X Y Z A X B Y C Z D X E Y F Z 我想要的不是交叉连接,或者别的什么,我只想要a和B在一起,当B的行数用完时,重复,所以输出(表3)如下所示: A B C D E F X Y Z A X B Y C Z D X E Y F Z 我不想添加或删除任何行。最终结果的行数应与表

我想用另外两个表中的数据组合创建一个表。假设表1如下所示:

A
B
C
D
E
F
X
Y
Z
A X
B Y
C Z
D X
E Y
F Z
表二是这样的:

A
B
C
D
E
F
X
Y
Z
A X
B Y
C Z
D X
E Y
F Z
我想要的不是交叉连接,或者别的什么,我只想要a和B在一起,当B的行数用完时,重复,所以输出(表3)如下所示:

A
B
C
D
E
F
X
Y
Z
A X
B Y
C Z
D X
E Y
F Z

我不想添加或删除任何行。最终结果的行数应与表1中的行数完全相同。如果这样做更简单,那么表1中的行数总是表2中行数的完美倍数,因此我不必担心部分匹配。如果表1有12行,那么表2将重复4次而不是2次,结果仍然是12行。

您可以使用模运算:

select o.*, t.*
from (select o.*, row_number() over (order by (select null)) as seqnum
      from one o
     ) o join
     (select t.*, row_number() over (order by (select null)) as seqnum,
             count(*) over () as cnt
      from two
     ) t
     on (o.seqnum - 1) % cnt = t.seqnum - 1

这将向每个表添加一个枚举值。然后,它使用模运算来匹配行。

两个表都是按其单个列排序的吗?是的,但实际上没有顺序,因为我应该能够按第一列“排序”,并有效地得到表3中的结果(表2中的每一行都与表一中的一行关联,次数相同……在本例中为两次)。因此(
a
Y
);(
B
X
);(
C
Z
)重复两次是可以接受的结果?如果没有明确的顺序,表只是行的集合。表
TWO
中的行数始终是表
ONE
中的行数的两倍。每次都很完美。不,顺序很重要,因为表1中的每一行都应该正好有一次。因此,您将得到(a,X),(B,Y),(C,Z),(D,X),(E,Y)和(F,Z)。表1中的行数始终是表2中一行或多行数的精确倍数,但是,以前的解决方案不需要这样做,因为它只需将表2中的有序行模化,这对我来说是有效的。我使用了适当的ORDER BY而不是(select null)回答得不错,我也能复制这个,但我不明白%是如何改变一切的。