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的答案。这将生成两个表的笛卡尔乘积。是的,您是对的。更正了为联接添加行号的答案