在Postgres里9.3或更高版本使用LATERAL
加入:
SELECT v.col_a, v.col_b, f.* -- no parentheses here, f is a table alias
FROM v_citizenversions v
LEFT JOIN LATERAL f_citizen_rec_modified(v.col1, v.col2) f ON true
WHERE f.col_c = _col_c;
为什么LEFT JOIN LATERAL ... ON true
?
对于旧版本,有完成什么我认为你正在试图用设置返回函数(RETURNS TABLE
or RETURNS SETOF record
OR RETURNS record
)一个非常简单的方法:
SELECT *, (f_citizen_rec_modified(col1, col2)).*
FROM v_citizenversions v
函数计算值o nce用于外部查询的每一行。如果该函数返回多行,则结果行将相应地相乘。所有括号在语法上都需要来分解行类型。表函数可以是这个样子:
CREATE OR REPLACE FUNCTION f_citizen_rec_modified(_col1 int, _col2 text)
RETURNS TABLE(col_c integer, col_d text) AS
$func$
SELECT s.col_c, s.col_d
FROM some_tbl s
WHERE s.col_a = $1
AND s.col_b = $2
$func$ LANGUAGE sql;
你必须在一个子查询或CTE来包装这个,如果你想要,因为列不是在同一水平上可见的应用WHERE
条款。 (和它的性能更好,无论如何,因为你防止反复评估函数的每个输出列):
SELECT col_a, col_b, (f_row).*
FROM (
SELECT col_a, col_b, f_citizen_rec_modified(col1, col2) AS f_row
FROM v_citizenversions v
) x
WHERE (f_row).col_c = _col_c;
还有其他几种方法可以做到这一点或类似的东西。这完全取决于你想要的东西。
你不需要跨在Postgres的适用。您可以像使用函数一样使用表函数。只需加入他们。 – 2012-07-13 15:36:11
@a_horse_with_no_name - 'CROSS APPLY'用相关的参数重新执行TVF,而不是执行一次,然后加入结果。 – 2012-07-13 15:37:39