【问题标题】:PostgreSQL How to return tuple {a,b} but not tuple {b,a}?PostgreSQL 如何返回元组 {a,b} 但不返回元组 {b,a}?
【发布时间】:2013-11-01 17:17:16
【问题描述】:

给定一个包含几何数据的多边形表并使用 ST_INTERESECTS(),我们如何返回相交的多边形,同时防止我们的结果冗余?

需要明确的是,如果我们返回多边形 A 与多边形 B 相交,那么返回行多边形 B 与多边形 A 相交也是多余的。

例子:

SELECT table1.name, table2.name 
FROM tl AS table1, tl AS table2
WHERE table1.name <> table2.name  // prevent returning A intersects A
AND ST_INTERSECTS( table1.coords, table2.coords) 
ORDER BY table1.name asc;

返回

你好 花生酱 你好 黄油花生

我想要

你好 花生酱

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    您可以决定您始终首先显示较小的值,然后使用&lt; 而不是仅使用&lt;&gt;

    SELECT table1.name, table2.name 
    FROM tl AS table1, tl AS table2
    WHERE table1.name < table2.name -- The aforementioned assumption
    AND ST_INTERSECTS( table1.coords, table2.coords) 
    ORDER BY table1.name asc;
    

    【讨论】:

    • +1 这是标准方式。我们假设“名称”是 PK
    • 嗯,这比预期的要容易得多。另外,leonbloy,感谢您提到我们假设“名称”是 PK。不是,但我很容易调整查询以使用 PK。我会接受的。
    【解决方案2】:

    另一种选择是对结果应用 DISTINCT:

    SELECT DISTINCT least(table1.name, table2.name) as name1, 
                    greatest(table1.name, table2.name) as name2
    FROM tl AS table1, tl AS table2
    WHERE table1.name <> table2.name  -- prevent returning A intersects A
    AND ST_INTERSECTS( table1.coords, table2.coords) 
    ORDER BY table1.name asc;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-20
      • 2016-11-19
      • 1970-01-01
      • 1970-01-01
      • 2020-04-13
      相关资源
      最近更新 更多