我正在尝试合并来自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,则在union的结果中将其排除。 从本质上讲,这结合了“孩子”和“没有孩子的父母”
附加问题:是否可以通过q1.parent对结果进行排序,除非在消除后q2中存在行,在这种情况下我们将q2行“插入”q1的结果集中基于q1.parent和q2.id?
示例结果排序:
name id parent
----------------------
name1 0 10
name5 11 42
name2 1 12
答案 0 :(得分:1)
这样的事情应该有效:
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))
答案 1 :(得分:0)
你不能在第二个选择中添加where子句吗?
(select * from func1(arg2)
where ID not in (select parent from func1(arg1))
或者您可能需要在临时表中选择联合,然后将过滤器应用于结果中的新选择。
我现在无法访问数据库来摆弄它。