我正在使用 PostgreSQL 9.2.4。
问题
我有一个带有 ID 的表和某种类型的第二列。我们称之为类型X
。我还有一个二进制函数,它对一对X
s 进行操作并返回一个布尔值。我们将调用此函数f
。f
是传递的;即,如果f(a,b)
和f(b,c)
都返回真,那么f(a,c)
也会。
我想要做的是获取一组 ID,第二列的所有对都为这个二进制函数返回 true。我怎样才能做到这一点?
性能不是一个大问题。这是导入过程的一部分,大约每年运行一次。否则在此导入期间数据库将不会被使用。
(相对)简单的例子
我创建了一个 SQL Fiddle 来开始工作:http ://sqlfiddle.com/#!12/57b97/3 。f
我想通过函数的结果来收集 ID 。请记住,一般来说,f
可能会更复杂。这只是一个例子。
我正在使用此示例 SQL Fiddle 查找的输出将类似于以下内容:
{1,3,6}
{2,4}
例如,假设我们从一个集合中选择任意一对 ID。假设我们选择1
和3
。然后SELECT f((SELECT data FROM temp WHERE id = 1), (SELECT data FROM temp WHERE id = 3));
返回真。
5
没有出现在任何地方,因为'green'
它是唯一长度为 5 的字符串。如果我得到重复的就可以了;我可以弄清楚如何清理它们。
真实情况详情
实际上,我的“第二列”是 PostGIS GEOMETRY(LINESTRING)
,而我的“二进制函数”是ST_Equals
. 所以真的,我正在寻找一堆重复的线串。除了表明我无法将问题简化为更易于处理的操作之外,我认为这些信息与手头的问题无关。