Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何合并查询结果,但排除基于两列相等的匹配项_Sql_Postgresql_Join - Fatal编程技术网

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