首页 > 解决方案 > 基于尚未匹配的第一个匹配的出现顺序的 SQL 连接

问题描述

假设我有 2 个表 - 表 1 和表 2:

在此处输入图像描述在此处输入图像描述

我希望能够按照两个表的显示顺序进行下去,并且匹配不重复。所以对于这个例子:

  1. 查看表 1,ID 1 并匹配到第一个与表 2 匹配的类型。在这种情况下,表 1 中的 ID 1 的类型是 A。所以在表 2 中按照它出现的顺序查看,并得到第一个颜色具有尚未匹配的 A 类型。在这种情况下,这将是“红色”
  2. 查看表 1,ID 2 并匹配到与表 2 匹配的第一个类型。在这种情况下,表 1 中的 ID 2 的类型是 B。所以在表 2 中按照它出现的顺序查看,并得到第一个颜色具有尚未匹配的 B 类型。在这种情况下,这将是“绿色”
  3. 查看表 1,ID 3 并匹配到与表 2 匹配的第一个类型。在这种情况下,表 1 中的 ID 3 的类型再次为 A。因此,在表 2 中按其呈现的顺序查看,并获得第一个具有尚未匹配的类型 A 的颜色。在这种情况下,这将是“黄色”
  4. 查看表 1,ID 4 并匹配到与表 2 匹配的第一个类型。在这种情况下,表 1 中的 ID 4 的类型是 C。所以在表 2 中按照它出现的顺序查看,并得到第一个颜色具有尚未匹配的 C 类型。在这种情况下,那将是“蓝色”
  5. 查看表 1,ID 5 并匹配到与表 2 匹配的第一个类型。在这种情况下,ID 5 的表 1 中的类型再次为 B。因此,在表 2 中按其呈现顺序查看,并获得第一个 B 类型尚未匹配的颜色。在这种情况下,所有类型 B 都已匹配,因此返回“Null”

所以结果表看起来像这样:

在此处输入图像描述

SQL将如何做到这一点?有没有一种“加入”可以做到这一点?是否可以在 SQL 中使用 for 循环,从表 2 中找到匹配项,并及时从表 2 中删除该实例以进行循环的下一次迭代?

标签: sqlsql-server

解决方案


使用行号:

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,因此结果中不保证排序。


推荐阅读