2016-04-18 104 views
0

我需要根据子查询的结果更新列。如果子查询返回该列的结果,则列必须更新,查询是否返回该列的结果,然后我需要用0更新。CASE语句中的更新列与子查询的结果postgres

我不知道将子查询放在哪里以及如何组合它与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 

回答

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);