函数返回表和IN运算符

时间:2017-06-21 06:49:47

标签: sql postgresql

我正在使用Postgres并拥有以下架构:

create table a(a int);
create table b(b int);
CREATE OR REPLACE FUNCTION f() RETURNS table(a int)
LANGUAGE sql AS
$$
  select a from a
$$;

现在我想运行以下查询:

select * from b where b in f();

不幸的是它会返回语法错误,但以下查询工作正常:

select * from b where b in (select * from f());

有没有办法实现第一种类型的查询,因为第二种更详细?也许我可以返回Table而不是其他类型的那个?

谢谢。

1 个答案:

答案 0 :(得分:1)

https://www.postgresql.org/docs/current/static/functions-subquery.html#FUNCTIONS-SUBQUERY-IN

  

表达式IN(子查询)

所以select * from b where b in f();看起来像... where b in a,因此它不是子查询。它既不是价值表。所以它不起作用...同时select * from b where b in (select * from f())有效且应该有效,因为它是一个适当的子查询。

在没有子查询的情况下实现上述的方法是join(但是你必须记住,如果a.a包含重复的值,那么join会返回重复的结果):

select DISTINCT b.* 
from b 
join f() on b.b = f.a

更新关于Oto Shavadze珍贵的评论