首页 > 解决方案 > 严格按顺序将两个表连接在一起

问题描述

如果我有两个表(t1,t2),每个表都有一列

t1      
letters  
a         
b         
c         

t2
nums
1
2
3

是否有可能以产生如下所示的两列结果集的方式将两者“连接”在一起:

letters nums
a       1
b       2
c       3

解决方案要求:

加分点: - 如果两个表的行数不同,则最终结果集是两个表的最大值的计数,“缺失”数据为空值。

只是想知道这是否可能考虑到限制。

标签: sql

解决方案


你想用row_number(). 但是,SQL 表表示无序集,因此您需要一个指定排序的列。

这个想法是:

select l.letter, n.number
from (select l.*, row_number() over (order by ?) as seqnum
      from letters l
     ) l join
     (select n.*, row_number() over (order by ?) as seqnum
      from numbers n
     ) n
     on l.seqnum = n.seqnum;

?用于指定排序的列。

如果您想要两个表中的所有行,请使用full join而不是内部连接。

编辑:

row_number()是显而易见的解决方案,但您可以使用相关子查询来执行此操作,假设值是唯一的:

select l.letter, n.number
from (select l.*, 
             (select count(*) from letters l2 where l2.letter <= l.letter) as seqnum
      from letters l
     ) l join
     (select n.*, 
             (select count(*) from numbers n2 where n2.num <= n.num) as seqnum
      from numbers n
     ) n
     on l.seqnum = n.seqnum;

row_number()考虑到它是几乎所有数据库都支持的 ISO/ANSI 标准函数,我发现不使用的限制相当荒谬。


推荐阅读