使用with as 和多个case when then 1 else 0 end

  两个 表 a,b  多对多得关系 和一个中间表 c

  第一个表adata 根据第二个表b更新

  根据 表C

  如果a对应得b得data全是1,a表得data就是1,
  如果a对应得b得data全是2,a表得data就是2,
  如果a对应得b得data全是1和2,a表得data就是3,
  如果a对应得b得data全是0,a表得data就是0,

  使用sql 进行修改值,

  首先使用with as 进行效率得提高,且需要多个虚拟表,所以还需要case when 进行查询出来修改值, 最后通过update 直接修改,不用再修改的时候查询

具体代码

WITH ctable AS (
    SELECT
        ci.catalog_id,
        ci.item_id ,
        i.monitor_status i_monitor_status,
        c.monitor_status c_monitor_status 
    FROM
        data_catalog_item ci,
        data_item i,
        data_catalog c 
    WHERE
        ci.item_id = i.id 
        AND ci.catalog_id = c.id 
    ),
    ctableFinal AS (
    SELECT DISTINCT
        catalog_id,
    CASE
            
            WHEN catalog_id IN ( SELECT catalog_id FROM ctable WHERE i_monitor_status = '1' ) 
            AND catalog_id NOT IN ( SELECT catalog_id FROM ctable ct WHERE i_monitor_status = '2' ) THEN
                1 ELSE
            CASE
                    
                    WHEN catalog_id IN ( SELECT catalog_id FROM ctable WHERE i_monitor_status = '2' ) 
                    AND catalog_id NOT IN ( SELECT catalog_id FROM ctable ct WHERE i_monitor_status = '1' ) THEN
                        2 ELSE
                    CASE
                            
                            WHEN catalog_id IN ( SELECT catalog_id FROM ctable WHERE i_monitor_status = '2' ) 
                            AND catalog_id IN ( SELECT catalog_id FROM ctable ct WHERE i_monitor_status = '1' ) THEN
                                3 ELSE
                            CASE
                                    
                                    WHEN catalog_id IN ( SELECT catalog_id FROM ctable WHERE i_monitor_status = '0' ) 
                                    AND catalog_id NOT IN ( SELECT catalog_id FROM ctable ct WHERE i_monitor_status = '1' OR i_monitor_status = '2' ) THEN
                                        0 
                                    END 
                                    END 
                                    END 
                                    END c_monitor_status_final 
FROM
    ctable )
UPDATE data_catalog 
    SET data_catalog.monitor_status = cf.c_monitor_status_final 
FROM
    data_catalog,
    ctableFinal cf 
WHERE
    data_catalog.id = cf.catalog_id 
    AND data_catalog.monitor_status != cf.c_monitor_status_final

重点:

  with 虚拟表名 as(查询语句且保存到虚拟表中),

  多个虚拟表需要‘,’逗号个开 ctableFinal AS ( select * from data),且后面马上跟 insert,update,select 使用它,否则无法使用改虚拟表

 select CASE  WHEN catalog_id in('6') then 1 else 0 end c_data from data 格式 需要对查询出来的表进行修改值,然后直接update
 select CASE  WHEN 表字段 条件 then 成功为 1 else 失败为 0 end c_data 展示字段 from data 格式

distinct 去掉重复, 但是需要每一行记录需要相同数据,不能只有一个值相同
 

  2021-03-29 17:46:40

 

posted @ 2021-03-29 17:48  幻樱落日剑  阅读(1468)  评论(0编辑  收藏  举报