TSQL合并2数据集,相邻的行数为偶数

TSQL合并2数据集,相邻的行数为偶数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我正在努力实现的目标: Dataset 1 Name1 Name2 Name3 Dataset 2 Number1 Number2 Number3 将变为两列: dataset1 dataset2 Name1 Number1 Name2 Number2 Name3 Number3 我的数据集1和2将始终具有相等的行。 哪个名字和哪个号码相连我不在乎,只要两个名字不和同一个号码相连,反之亦然 如

我正在努力实现的目标:

    Dataset 1
    Name1
    Name2
    Name3

    Dataset 2
    Number1
    Number2
    Number3
将变为两列:

dataset1   dataset2
Name1      Number1
Name2      Number2
Name3      Number3
我的数据集1和2将始终具有相等的行。 哪个名字和哪个号码相连我不在乎,只要两个名字不和同一个号码相连,反之亦然


如何使用SQL/SQL Server解决此问题?

将标识列添加到两个表中,并基于这些列执行联接

ALTER TABLE Table1
  ADD ID INT IDENTITY(1,1) NOT NULL


ALTER TABLE Table2
  ADD ID INT IDENTITY(1,1) NOT NULL


SELECT Table1.dataset1col , Table2.dataset2Col
From Table1 INNER JOIN Table2 
     ON Table1.ID = Table2.ID

将标识列添加到这两个表中,并基于这些列执行联接

ALTER TABLE Table1
  ADD ID INT IDENTITY(1,1) NOT NULL


ALTER TABLE Table2
  ADD ID INT IDENTITY(1,1) NOT NULL


SELECT Table1.dataset1col , Table2.dataset2Col
From Table1 INNER JOIN Table2 
     ON Table1.ID = Table2.ID

如果不想向表中添加标识列,可以使用如下的ROW_NUMBER()函数:

SELECT
    T1.Col1,
    T2.Col1
FROM
    (SELECT Col1, ROW_NUMBER() OVER (ORDER BY Col1) AS N FROM Table1) T1
INNER JOIN
    (SELECT Col1, ROW_NUMBER() OVER (ORDER BY Col1) AS N FROM Table2) T2
ON T1.N = T2.N

在这里,将Table1和Table2替换为表的名称,并将Col1替换为要从这两个表中输出的列的名称。

如果不想向表中添加标识列,可以像下面这样使用ROW_NUMBER()函数:

SELECT
    T1.Col1,
    T2.Col1
FROM
    (SELECT Col1, ROW_NUMBER() OVER (ORDER BY Col1) AS N FROM Table1) T1
INNER JOIN
    (SELECT Col1, ROW_NUMBER() OVER (ORDER BY Col1) AS N FROM Table2) T2
ON T1.N = T2.N

在这里,将Table1和Table2替换为表的名称,并将Col1替换为要从这两个表中输出的列的名称。

这可能适用于您:

;WITH cte1 (name, rn)
     AS (SELECT Name,
                row_number()
                  OVER(
                    ORDER BY Name) rn
         FROM   Dataset1),
     cte2 (Number, rn)
     AS (SELECT Number,
                row_number()
                  OVER(
                    ORDER BY Number) rn
         FROM   Dataset2)
SELECT name,
       Number
FROM   cte1
       JOIN cte2
         ON cte1.rn = cte2.rn 

这可能适用于您:

;WITH cte1 (name, rn)
     AS (SELECT Name,
                row_number()
                  OVER(
                    ORDER BY Name) rn
         FROM   Dataset1),
     cte2 (Number, rn)
     AS (SELECT Number,
                row_number()
                  OVER(
                    ORDER BY Number) rn
         FROM   Dataset2)
SELECT name,
       Number
FROM   cte1
       JOIN cte2
         ON cte1.rn = cte2.rn 

编写查询的另一种方法是:

select row_number() over (order by Names asc) as rownum,
       Names
into  #Temp1
from NameTable

select row_number() over (order by Numbers asc) as rownum,
       Numbers
into  #Temp2
from NumberTable

select Names, Numbers
from #Temp1
inner join #Temp2 on #Temp1.rownum = #Temp2.rownum

另一种编写查询的方法是:

select row_number() over (order by Names asc) as rownum,
       Names
into  #Temp1
from NameTable

select row_number() over (order by Numbers asc) as rownum,
       Numbers
into  #Temp2
from NumberTable

select Names, Numbers
from #Temp1
inner join #Temp2 on #Temp1.rownum = #Temp2.rownum

因为您没有添加表名,所以我认为它是TA1和TA2


因为您没有添加表名,所以我将其视为TA1和TA2。

有3种可能的解决方案

首先:使用以下技巧(警告:在小数据集的情况下使用此技巧)

Second:使用变量表临时存储结果。此解决方案适用于相对较大的数据集。(约为100秒)

第三名: 如MMHASANN所述,在两个表中使用identitfy字段。但我最不喜欢这种方法,因为我们需要修改数据库结构


建议:使用变量表方法

有3种可能的解决方案

首先:使用以下技巧(警告:在小数据集的情况下使用此技巧)

Second:使用变量表临时存储结果。此解决方案适用于相对较大的数据集。(约为100秒)

第三名: 如MMHASANN所述,在两个表中使用identitfy字段。但我最不喜欢这种方法,因为我们需要修改数据库结构


建议:使用变量表方法

或者对这些数据集使用不同的查询,或者使用不同的SPS,只需两个不同的查询即可。从NameTable中选择名称,例如从NumberTable中选择数字。出于好奇,您需要这种表联接的原因是什么?您的表包含什么样的数据,因为它与记录的链接方式无关?或者您对这些数据集使用不同的查询,或者使用不同的SPS,只是两个不同的查询。从NameTable中选择名称,例如从NumberTable中选择数字。出于好奇,您需要这种表联接的原因是什么?您的表包含什么样的数据,因为记录的链接方式无关紧要?谢谢您的回复。然而,我不能改变数据集。因此,它必须在查询时完成。我还可以使用秩函数并在上面进行连接。还有更实用、更优雅的解决方案吗?谢谢你的回复。然而,我不能改变数据集。因此,它必须在查询时完成。我还可以使用秩函数并在上面进行连接。还有更实用、更优雅的解决方案吗?这会产生两张表的笛卡尔乘积。是的,你说得对。更正了添加JoinNumber的答案。这将生成两个表的笛卡尔乘积。是的,您是对的。更正了为联接添加行号的答案