使用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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM