兩個 表 a,b 多對多得關系 和一個中間表 c
第一個表a的data 根據第二個表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
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/271176.html
標籤:其他
