【发布时间】:2015-03-02 11:34:19
【问题描述】:
根据here 的说明,我创建了两个使用EXECUTE FORMAT 并返回(int,smallint) 的同一张表的函数。
示例定义:
CREATE OR REPLACE FUNCTION function1(IN _tbl regclass, IN _tbl2 regclass,
IN field1 integer)
RETURNS TABLE(id integer, dist smallint)
CREATE OR REPLACE FUNCTION function2(IN _tbl regclass, IN _tbl2 regclass,
IN field1 integer)
RETURNS TABLE(id integer, dist smallint)
两个函数返回完全相同的行数。示例结果(将始终按 dist 排序):
(49,0)
(206022,3)
(206041,3)
(92233,4)
有没有办法比较相同行的两个函数之间的第二个字段的值,以确保两个结果相同:
例如:
SELECT
function1('tblp1','tblp2',49),function2('tblp1_v2','tblp2_v2',49)
返回类似:
(49,0) (49,0)
(206022,3) (206022,3)
(206041,3) (206041,3)
(92233,4) (133,4)
虽然我并不期待相同的结果(每个函数都是一个 topK 查询,并且我有任意中断的关系/在第二个函数中进行了一些优化以获得更快的性能)我可以确保这两个函数如果每一行的结果中的第二个数字相同,则返回正确的结果。在上面的例子中,我可以确保得到正确的结果,因为:
1st row 0 = 0,
2nd row 3 = 3,
3rd row 3 = 3,
4th row 4 = 4
尽管对于第 4 行,92233!=133
有没有办法只获取每个函数结果的第二个字段,以批量比较它们,例如类似于:
SELECT COUNT(*)
FROM
(SELECT
function1('tblp1','tblp2',49).field2,
function2('tblp1_v2','tblp2_v2',49).field2 ) n2
WHERE function1('tblp1','tblp2',49).field2 != function1('tblp1','tblp2',49).field2;
我使用的是 PostgreSQL 9.3。
【问题讨论】:
-
您必须使用
select * from function1('tblp1','tblp2',49)来设置返回函数。不要将它们放入选择列表中。 -
您添加了
(will be always ordered by dist)。你确定,这不会为误报打开可能性吗? -
@ErwinBrandstetter 这是一个topK查询(ORDERED BY dist LIMIT k),所以函数内部的结果是按dist排序的。我想检查一个具体的例子,我得到一个 dist = 1 的答案,两个 dist = 3 的答案和一个 dist = 4 的答案 k = 4。这两个函数都在不同的表上运行(第二个函数在优化表上运行),我想确保两个函数对所有 k 结果返回相同的 dist。在我们的例子中,dist 1 和 dist 3 的结果总是相同的(没有其他结果与 dist=3),但在 4 的情况下,我可能会得到 dist =4 的许多结果。
-
那么,行是按匹配的顺序返回的吗?其余的对于这个问题并不重要。
-
@a_horse_with_no_name:这实际上没有抓住问题的重点。
标签: sql postgresql postgresql-9.3 set-returning-functions