使用子查询postgres

时间:2016-04-18 10:14:15

标签: sql postgresql postgis

我需要根据子查询的结果更新列。如果子查询返回该列的结果,那么必须更新列,如果查询没有返回该列的结果,那么我需要用0更新。

我不知道子查询的放置位置以及如何将它与CASE语句结合起来。这是我的想法,但语法不正确。有人可以帮忙吗?

(SELECT datazones.ogc_fid, count(*) as total 
FROM suppliersnew suppliers, datazone_report_resupply datazones
WHERE St_contains(datazones.geom, suppliers.geometry) AND (suppliers.status = 'Under construction' OR
suppliers.status = 'Unknown' OR suppliers.status = 'Operational') GROUP by datazones.ogc_fid ORDER BY total ASC) sources 

UPDATE datazone_report_resupply
SET es_actual =
CASE 
    WHEN datazone_report_resupply.ogc_fid = sources.ogc_fid THEN sources.total
    ELSE 0
END

1 个答案:

答案 0 :(得分:0)

查询有点难以理解,因为聚合在外部列上(这是不寻常的)。但是,您不需要聚合或按顺序排序。你似乎只关心是否存在一行。

我认为逻辑是:

UPDATE datazone_report_resupply r
SET es_actual =
    (CASE WHEN EXISTS (SELECT 1
                       FROM suppliersnew s
                       WHERE St_contains(r.geom, s.geometry) AND
                             s.status IN ('Under construction', 'Unknown', 'Operational')
                      ) 
          THEN 1 ELSE 0
      END);