严格按顺序将两个表连接在一起

Jos*_*ehl 3 sql

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

t1      
letters  
a         
b         
c         

t2
nums
1
2
3
Run Code Online (Sandbox Code Playgroud)

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

letters nums
a       1
b       2
c       3
Run Code Online (Sandbox Code Playgroud)

解决方案要求:

  • 必须以指定的顺序组合每个表的数据,以便能够在加入之前对每个表的数据进行排序
  • 不使用任何功能(例如row_number)添加额外的列以进行连接

优点:-如果两个表的行数不同,则最终结果集将是两个表的最大值的计数,并且“丢失”数据为null。

只是想知道在给定约束的情况下这是否可能。

Gor*_*off 6

您要使用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;
Run Code Online (Sandbox Code Playgroud)

?是,指定排序列。

如果要在两个表中都包含所有行,请使用full join而不是内部联接。

EDTI:

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;
Run Code Online (Sandbox Code Playgroud)

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