Sql 根据每个唯一标识符的条件更新值
我有一个查询,我想根据每个主键的特定条件更新一个值。例如,无论哪种类型是石棉,而该特定项目中不存在CONTIN类型,我想将石棉改为CONTIN 我通过下面的查询实现了这一点,但这会将整个值更新为CONTIN,即使CONTIN已经存在,基本上会导致重复的值。仅当CONTIN不存在时才应添加它。也许windows函数可以工作,以便它查看每个单独的项目,但我得到了一个语法错误。谢谢你的帮助Sql 根据每个唯一标识符的条件更新值,sql,database,oracle,case,Sql,Database,Oracle,Case,我有一个查询,我想根据每个主键的特定条件更新一个值。例如,无论哪种类型是石棉,而该特定项目中不存在CONTIN类型,我想将石棉改为CONTIN 我通过下面的查询实现了这一点,但这会将整个值更新为CONTIN,即使CONTIN已经存在,基本上会导致重复的值。仅当CONTIN不存在时才应添加它。也许windows函数可以工作,以便它查看每个单独的项目,但我得到了一个语法错误。谢谢你的帮助 SELECT PROJECT, CASE WHEN TYPE = 'ASBESTOS' AND TYPE
SELECT PROJECT,
CASE WHEN TYPE = 'ASBESTOS' AND TYPE NOT IN 'CONTIN' THEN 'CONTIN' ELSE TYPE END AS TYPE,
SUM(OBLIGATION) AS OBS
FROM OBS_MASTER
WHERE PROJECT = '074190'
GROUP BY PROJECT, TYPE;
Original:
PROJECT TYPE OBS
074190 ASBESTOS 26326.99
074190 CM 0
Current Result:
PROJECT TYPE OBS
074190 CM 0
074190 CONTIN 26326.99
如果我理解正确,您可以使用窗口函数计算每个项目的contin数,然后将该信息用于聚合键:
SELECT PROJECT,
(CASE WHEN NUM_CONTIN = 0 AND TYPE = 'ASBESTOS' THEN 'CONTIN' ELSE TYPE
END) as TYPE
SUM(OBLIGATION) AS OBS
FROM (SELECT om.*,
SUM(CASE WHEN TYPE = 'CONTIN' THEN 1 ELSE 0 END) OVER (PARTITION BY PROJECT) as NUM_CONTIN
FROM OBS_MASTER om
) om
WHERE PROJECT = '074190'
GROUP BY PROJECT,
(CASE WHEN NUM_CONTIN = 0 AND TYPE = 'ASBESTOS' THEN 'CONTIN' ELSE TYPE
END)
还有一个选择:
SQL> with
2 obs_master (project, type, obligation) as
3 -- sample data
4 (select 1, 'ASBESTOS', 2500 from dual union all
5 select 1, 'CONTIN' , 1500 from dual union all
6 select 1, 'CM' , 500 from dual union all
7 --
8 select 2, 'ASBESTOS', 1000 from dual union all
9 select 2, 'CM' , 1000 from dual
10 ),
11 temp as
12 -- check whether project has CONTIN type
13 (select project, min(type) cb_contin
14 from obs_master
15 group by project, type
16 having type = 'CONTIN'
17 )
18 select a.project,
19 -- if type = ASBESTOS and that project doesn't contain CONTIN,
20 -- replace ASBESTOS with CONTIN
21 case when a.type = 'ASBESTOS' and
22 b.cb_contin <> 'CONTIN'
23 then 'CONTIN'
24 else a.type
25 end type,
26 sum(a.obligation) obs
27 from obs_master a left join temp b on a.project = b.project
28 group by a.project,
29 case when a.type = 'ASBESTOS' and
30 b.cb_contin <> 'CONTIN'
31 then 'CONTIN'
32 else a.type
33 end
34 order by a.project;
PROJECT TYPE OBS
---------- -------- ----------
1 ASBESTOS 2500
1 CM 500
1 CONTIN 1500
2 ASBESTOS 1000
2 CM 1000
SQL>
如果您的目标只是更新类型值,那么下面的语句可能会起作用:
UPDATE OBS_MASTER
SET TYPE='CONTIN'
WHERE TYPE='ASBESTOS' and
PROJECT not in
(select distinct PROJECT
from OBS_MASTER
where TYPE='CONTIN')
希望这有帮助。您的查询没有更新任何内容。我没有尝试更新表本身。谢谢你的帮助