首页 > 解决方案 > 从第一个表中选择所有行,除了第二个表中的第一次出现

问题描述

我试图找出一种从第一个表中选择所有行的方法,除了行重复时第二个表中的第一次出现。

例如,

表格1:

ABC
ABC
DEF
GHJ
GHJ

表2:

ABC
GHJ

预期结果(来自第一个表):

ABC
DEF
GHJ

所以第一个 ABC 和第一个 GHJ 从第一个表中删除。

标签: sqlsql-server

解决方案


你需要使用row_number()来处理这个:

select t1.*
from (select col, row_number() over (partition by col order by col) as seqnum
      from t1
     ) t1 left join
     (select col, row_number() over (partition by col order by col) as seqnum
      from t2
     ) t2
     on t1.name = t2.name and t1.seqnum = t2.seqnum
where t2.name is null;

注意:这将返回任意名称。SQL 表表示无序集,因此表中没有“第一”行,除非列指定了排序。如果您有订购的想法,那么将其用于order by.

此外,这允许重复,如果有的话t2,所有这些都将被删除。t1


推荐阅读