Sql 如何合并查询结果,但排除基于两列相等的匹配项
我尝试合并两个查询的结果,但根据两列是否相等来删除行 下面是一个简单的例子:Sql 如何合并查询结果,但排除基于两列相等的匹配项,sql,postgresql,join,Sql,Postgresql,Join,我尝试合并两个查询的结果,但根据两列是否相等来删除行 下面是一个简单的例子: select * from func1(arg1) q1 name id parent ---------------------- name1 0 10 name2 1 12 select * from func1(arg2) q2 name id parent ---------------------- name4 10
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的常规并集)
我要找的是这样的总共3行:
name id parent
----------------------
name1 0 10
name2 1 12
name5 11 42
也就是说,如果q2中的一行的id在q1中作为父行存在,则将其排除在联合的结果中。
本质上,这结合了“孩子”和“没有孩子的父母”
附加问题:是否可以按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))
不能在第二个select中添加where子句吗
(select * from func1(arg2)
where ID not in (select parent from func1(arg1))
或者,您可能需要将联合选择到临时表中,然后将过滤器应用到结果中的新选择
我现在没有访问DB的权限来摆弄它。太棒了,这种语法很管用!(必须将where not exists部分切换到底部选择)。对文章底部的附加问题有什么想法吗?对不起,我不明白第二个问题。你应该为此创建第二个帖子
(select * from func1(arg2)
where ID not in (select parent from func1(arg1))