用适当的连接替换子查询

Replace subquery with appropriate join

如何删除带有连接的子查询?

SELECT distinct t."groupId" FROM "contacts" c 
        INNER JOIN
        ( 
        SELECT DISTINCT td.* FROM "groups" g
        INNER JOIN 
        "territory" td 
        ON 
        td."groupId" = g.id
        WHERE g."orgId" = 3
        ) 
        t
        ON 
        ST_Intersects(t.points, c."geoPoint")
        WHERE c.id = 33 and c."orgId" = 3

子查询没有问题,但你应该摆脱可怕的 DISTINCT:

SELECT td."groupId"
FROM territory AS td
WHERE EXISTS (SELECT 1 FROM contacts AS c
              WHERE ST_Intersects(td.points, c."geoPoint")
                AND c.id = 33
                AND c."orgId" = 3)
  AND EXISTS (SELECT 1 FROM groups AS g
              WHERE td."groupId" = g.id
                AND g."orgId" = 3);

如果你坚持没有子查询,使用

SELECT DISTINCT t."groupId"
   FROM contacts c 
      INNER JOIN territory td 
         ON ST_Intersects(td.points, c."geoPoint")
      INNER JOIN groups g
         ON td."groupId" = g.id
WHERE g."orgId" = 3
  AND c.id = 33
  AND c."orgId" = 3;

如果您需要确保仅针对 territory 中与 groups 的连接匹配的行调用 st_intersects 函数,您将必须使用子查询。没有其他方法可以强制加入顺序。