sql - 严格按顺序将两个表连接在一起
问题描述
如果我有两个表(t1,t2),每个表都有一列
t1
letters
a
b
c
t2
nums
1
2
3
是否有可能以产生如下所示的两列结果集的方式将两者“连接”在一起:
letters nums
a 1
b 2
c 3
解决方案要求:
- 必须按照指定的顺序组合每个表的数据,以便能够在加入之前对每个表的数据进行排序
- 不使用任何函数,如 row_number,添加额外的列加入
加分点: - 如果两个表的行数不同,则最终结果集是两个表的最大值的计数,“缺失”数据为空值。
只是想知道这是否可能考虑到限制。
解决方案
你想用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 标准函数,我发现不使用的限制相当荒谬。
推荐阅读
- java - ConcurrentMap 按需加载java
- c# - 在 XAML 中指定的代码中调用事件
- python - 在 Python 中计算子文件夹中的文件数
- javascript - Accordian - 隐藏面板直到搜索
- python - Selenium 只点击第一个结果
- c# - 如何确定 Json SerializerSettings 错误的发件人
- python - Google 表格 API Python 错误 googleapiclient.errors.HttpError:
我是谷歌表格 API 的新手,我正在尝试使用 python 3.9 设置我的谷歌服务帐户 API,以将列表输出到我的表格中。我已经阅读了 google api 上的说明,但仍然对 python 上的设置感到困惑。我在谷歌云控制台上启用了谷歌表格、谷歌驱动应用程序。
- gremlin - Gremlin.NET 反序列化数字属性
- python - 在 Docker 容器内运行 mitmproxy-node?
- python - 为什么每次我尝试让我的精灵跳跃时我的 Pygame 都会崩溃?