由于两个表上的 ID 都没有唯一性,让我们为其添加一些唯一性。
所以它可以用来加入。
可以使用窗口函数ROW_NUMBER。
给出预期结果的示例解决方案:
DECLARE @TestTable1 TABLE (ID INT, Data VARCHAR(1));
DECLARE @TestTable2 TABLE (ID INT, Data VARCHAR(1));
INSERT INTO @TestTable1 VALUES (1,'r'),(2,'t'),(3,'z'),(1,'u');
INSERT INTO @TestTable2 VALUES (1,'q'),(1,'a'),(2,'x'),(3,'c');
select
t1.ID, t1.Data,
t2.Data as Data2
from (
select ID, Data,
row_number() over (partition by ID order by Data) as rn
from @TestTable1
) t1
left join (
select ID, Data,
row_number() over (partition by ID order by Data) as rn
from @TestTable2
) t2 on t1.ID = t2.ID and t1.rn = t2.rn;
注意:由于 LEFT JOIN,这确实假设 table2 中相同 ID 的数量与 table1 上的相同或更少。但如果不是这种情况,您可以将其更改为 FULL JOIN。
返回:
ID Data Data2
1 r a
1 u q
2 t x
3 z c
获得其他结果可以通过不同的方式实现。
这其实是比较常见的情况。
一个人想要表 1 中的所有内容,但对于表 1 的每条记录只能从表 2 中获取一个值。
1) top 1 with ties 与 order by rownumber() 的组合
select top 1 with ties
t1.ID, t1.Data,
t2.Data as Data2
from @TestTable1 t1
left join @TestTable2 t2 on t1.ID = t2.ID
order by row_number() over (partition by t1.ID, t1.Data order by t2.Data desc);
top 1 with ties 只会显示row_number() = 1 的那些
2) 在子查询中使用 row_number:
select ID, Data, Data2
from (
select
t1.ID, t1.Data,
t2.Data as Data2,
row_number() over (partition by t1.ID, t1.Data order by t2.Data desc) as rn
from @TestTable1 t1
left join @TestTable2 t2 on t1.ID = t2.ID
) q
where rn = 1;
3) 只是一个简单的分组和一个最大值:
select t1.ID, t1.Data, max(t2.Data) as Data2
from @TestTable1 t1
left join @TestTable2 t2 on t1.ID = t2.ID
group by t1.ID, t1.Data
order by 1,2;
所有 3 个都给出相同的结果:
ID Data Data2
1 r q
1 u q
2 t x
3 z c