sql - 基于尚未匹配的第一个匹配的出现顺序的 SQL 连接
问题描述
假设我有 2 个表 - 表 1 和表 2:
我希望能够按照两个表的显示顺序进行下去,并且匹配不重复。所以对于这个例子:
- 查看表 1,ID 1 并匹配到第一个与表 2 匹配的类型。在这种情况下,表 1 中的 ID 1 的类型是 A。所以在表 2 中按照它出现的顺序查看,并得到第一个颜色具有尚未匹配的 A 类型。在这种情况下,这将是“红色”
- 查看表 1,ID 2 并匹配到与表 2 匹配的第一个类型。在这种情况下,表 1 中的 ID 2 的类型是 B。所以在表 2 中按照它出现的顺序查看,并得到第一个颜色具有尚未匹配的 B 类型。在这种情况下,这将是“绿色”
- 查看表 1,ID 3 并匹配到与表 2 匹配的第一个类型。在这种情况下,表 1 中的 ID 3 的类型再次为 A。因此,在表 2 中按其呈现的顺序查看,并获得第一个具有尚未匹配的类型 A 的颜色。在这种情况下,这将是“黄色”
- 查看表 1,ID 4 并匹配到与表 2 匹配的第一个类型。在这种情况下,表 1 中的 ID 4 的类型是 C。所以在表 2 中按照它出现的顺序查看,并得到第一个颜色具有尚未匹配的 C 类型。在这种情况下,那将是“蓝色”
- 查看表 1,ID 5 并匹配到与表 2 匹配的第一个类型。在这种情况下,ID 5 的表 1 中的类型再次为 B。因此,在表 2 中按其呈现顺序查看,并获得第一个 B 类型尚未匹配的颜色。在这种情况下,所有类型 B 都已匹配,因此返回“Null”
所以结果表看起来像这样:
SQL将如何做到这一点?有没有一种“加入”可以做到这一点?是否可以在 SQL 中使用 for 循环,从表 2 中找到匹配项,并及时从表 2 中删除该实例以进行循环的下一次迭代?
解决方案
使用行号:
select t1.*, t2.*
from (select t1.*, row_number() over (partition by type order by id) as seqnum
from table1 t1
) t1 left join
(select t2.*, row_number() over (partition by type order by (select null)) as seqnum
from table1 t2
) t2
on t1.type = t2.type and t1.seqnum = t2.seqnum;
请注意,SQL 表表示无序集。您在 中没有明显的排序table2
,因此结果中不保证排序。
推荐阅读
- ruby-on-rails - Ruby 服务器端 Websocket 客户端
- woocommerce - WooCommerce 产品提要 Google 商家中心
- html - 我如何在我的导航栏上添加一个半透明的背景,同时在我的整个页面上有一个蓝色背景
- sql - F# 中的插值字符串
- javascript - 如何使用元素的类正确计算 html 表格列的选中复选框?
- c++ - 跨多个程序实例的 ZeroMQ IPC
- sql - 没有交叉表/tablefunc 的数据透视表
- machine-learning - 在 lightgbm 中定义自定义损失时出现分段错误
- python - pandas DataFrame.plot “没有要绘制的数字数据”,同时绘制第二次
- angular-material - Angular 8 和 Material Design 导航栏 - 显示所选项目