如何结合查询结果但排除基于两列相等的匹配

时间:2018-01-16 17:10:51

标签: sql postgresql join

我正在尝试合并来自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

2 个答案:

答案 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))

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

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