我正在尝试合并来自 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))
或者,您可能需要将并集选择到临时表中,然后将过滤器应用于结果中的新选择。
我现在无法访问数据库来摆弄它。