如何合并查询结果,但根据两列相等排除匹配项



我正在尝试合并来自 2 个查询的结果,但根据两列是否相等来消除行。

下面是一个快速示例:

select * from func1(arg1) q1
name      id    parent
----------------------
 name1     0      10
 name2     1      12

select * from func1(arg2) q2
name      id    parent
----------------------
 name4     10      42
 name5     11      42
 name6     12      42

我目前可以工作的是:

 select * from
 (select * from func1(arg1))
 union
 (select * from func1(arg2))

但是这种组合将返回总共 5 行(q1 和 q2 的常规并集(。

name      id    parent
----------------------
 name1     0      10
 name2     1      12
 name4     10     42
 name5     11     42
 name6     12     42

我正在寻找像这样的总共 3 行:

 name      id    parent
----------------------
 name1     0      10
 name2     1      12
 name5     11     42

即,如果 Q2 中的行具有作为 Q1 中的父项存在的 ID,则在并集的结果中将其排除。 从本质上讲,这结合了"孩子"和"无孩子的父母">


附加问题:是否可以按 q1.parent 对结果进行排序,除非在消除后 q2 中存在行,在这种情况下,我们会根据 q1.parent 和 q2.id 将 q2 行"插入"到 q1 的结果集中?

结果排序示例:

 name      id    parent
----------------------
 name1     0      10
 name5     11     42
 name2     1      12

这样的事情应该可以工作:

 select * from
 (select * from func1(arg1) a where not exists (select 1 from func1(arg2) b where a.id = b.parent))
 union
 (select * from func1(arg2))

你不能在第二个选择中添加一个 where 子句吗?

  (select * from func1(arg2) 
   where ID not in (select parent from func1(arg1))

或者,您可能需要将并集选择到临时表中,然后将过滤器应用于结果中的新选择。

我现在无法访问数据库来摆弄它。

最新更新