Sql 使用分组方式进行更新
我需要在特定属性上使用GROUPBY更新一个表,然后更新同一个表 这就是我想要实现的目标 样本记录: 表ABCSql 使用分组方式进行更新,sql,oracle,sql-update,Sql,Oracle,Sql Update,我需要在特定属性上使用GROUPBY更新一个表,然后更新同一个表 这就是我想要实现的目标 样本记录: 表ABC KEY REF_NO ATT_KEY 1 200 1 2 200 2 3 200 3 4 283 4 5 283 5 6 283 6 7 400 8 8 400 11 我想看到的输出:按参考号分组,如果我发现至少有一个att_键是奇数,那么我必须将所有偶数翻转为偶数-1,奇数将保持不变。att_键的一组数
KEY REF_NO ATT_KEY
1 200 1
2 200 2
3 200 3
4 283 4
5 283 5
6 283 6
7 400 8
8 400 11
我想看到的输出:按参考号分组,如果我发现至少有一个att_键是奇数,那么我必须将所有偶数翻转为偶数-1,奇数将保持不变。att_键的一组数字(1,2,3…24)
表ABC产出:
KEY REF_NO ATT_KEY
1 200 1
2 200 1
3 200 3
4 283 3
5 283 5
6 283 5
7 400 7
8 400 11
我很难理解这个逻辑。寻求帮助/建议
谢谢…您可以使用窗口功能完成此操作。此方法使用剩余部分的
max()
:
select key, ref_no,
(case when max(mod(att_key, 2)) over (partition by ref_no) = 1 and
mod(att_key, 2) = 0
then att_key - 1
else att_key
end) as newkey
from table t;
我不确定ATT_KEY
介于1和24之间的条件在哪里合适。也许您还需要一个WHERE
子句
您还可以将其表述为更新:
update t
set att_key = att_key - 1
where mod(att_key, 2) = 0 and
exists (select 1
from t t2
where t.ref_no = t2.ref_no and mod(att_key, 2) = 1
);
Oracle 11g R2架构设置:
CREATE TABLE ABC ( KEY, REF_NO, ATT_KEY ) AS
SELECT 1, 200, 1 FROM DUAL
UNION ALL SELECT 2, 200, 2 FROM DUAL
UNION ALL SELECT 3, 200, 3 FROM DUAL
UNION ALL SELECT 4, 283, 4 FROM DUAL
UNION ALL SELECT 5, 283, 5 FROM DUAL
UNION ALL SELECT 6, 283, 6 FROM DUAL
UNION ALL SELECT 7, 400, 8 FROM DUAL
UNION ALL SELECT 8, 400, 11 FROM DUAL
UNION ALL SELECT 9, 500, 12 FROM DUAL;
UPDATE ABC a
SET ATT_KEY = ATT_KEY - 1
WHERE MOD( ATT_KEY, 2 ) = 0
AND EXISTS (
SELECT 'X'
FROM ABC b
WHERE MOD( ATT_KEY, 2 ) = 1
AND a.REF_NO = b.REF_NO
);
SELECT *
FROM ABC
| KEY | REF_NO | ATT_KEY |
|-----|--------|---------|
| 1 | 200 | 1 |
| 2 | 200 | 1 |
| 3 | 200 | 3 |
| 4 | 283 | 3 |
| 5 | 283 | 5 |
| 6 | 283 | 5 |
| 7 | 400 | 7 |
| 8 | 400 | 11 |
| 9 | 500 | 12 |
查询1:
CREATE TABLE ABC ( KEY, REF_NO, ATT_KEY ) AS
SELECT 1, 200, 1 FROM DUAL
UNION ALL SELECT 2, 200, 2 FROM DUAL
UNION ALL SELECT 3, 200, 3 FROM DUAL
UNION ALL SELECT 4, 283, 4 FROM DUAL
UNION ALL SELECT 5, 283, 5 FROM DUAL
UNION ALL SELECT 6, 283, 6 FROM DUAL
UNION ALL SELECT 7, 400, 8 FROM DUAL
UNION ALL SELECT 8, 400, 11 FROM DUAL
UNION ALL SELECT 9, 500, 12 FROM DUAL;
UPDATE ABC a
SET ATT_KEY = ATT_KEY - 1
WHERE MOD( ATT_KEY, 2 ) = 0
AND EXISTS (
SELECT 'X'
FROM ABC b
WHERE MOD( ATT_KEY, 2 ) = 1
AND a.REF_NO = b.REF_NO
);
SELECT *
FROM ABC
| KEY | REF_NO | ATT_KEY |
|-----|--------|---------|
| 1 | 200 | 1 |
| 2 | 200 | 1 |
| 3 | 200 | 3 |
| 4 | 283 | 3 |
| 5 | 283 | 5 |
| 6 | 283 | 5 |
| 7 | 400 | 7 |
| 8 | 400 | 11 |
| 9 | 500 | 12 |
:
CREATE TABLE ABC ( KEY, REF_NO, ATT_KEY ) AS
SELECT 1, 200, 1 FROM DUAL
UNION ALL SELECT 2, 200, 2 FROM DUAL
UNION ALL SELECT 3, 200, 3 FROM DUAL
UNION ALL SELECT 4, 283, 4 FROM DUAL
UNION ALL SELECT 5, 283, 5 FROM DUAL
UNION ALL SELECT 6, 283, 6 FROM DUAL
UNION ALL SELECT 7, 400, 8 FROM DUAL
UNION ALL SELECT 8, 400, 11 FROM DUAL
UNION ALL SELECT 9, 500, 12 FROM DUAL;
UPDATE ABC a
SET ATT_KEY = ATT_KEY - 1
WHERE MOD( ATT_KEY, 2 ) = 0
AND EXISTS (
SELECT 'X'
FROM ABC b
WHERE MOD( ATT_KEY, 2 ) = 1
AND a.REF_NO = b.REF_NO
);
SELECT *
FROM ABC
| KEY | REF_NO | ATT_KEY |
|-----|--------|---------|
| 1 | 200 | 1 |
| 2 | 200 | 1 |
| 3 | 200 | 3 |
| 4 | 283 | 3 |
| 5 | 283 | 5 |
| 6 | 283 | 5 |
| 7 | 400 | 7 |
| 8 | 400 | 11 |
| 9 | 500 | 12 |
令人惊叹的。这一逻辑应该有效。让我试试。我的桌子有很多行。可能我必须将其转换为合并。如果这已回答了您的问题,您可以将其标记为已接受以结束该问题(并将此答案或您认为有价值的任何其他答案向上投票)。感谢您的帮助。