使用组更新

时间:2015-09-03 11:11:42

标签: sql oracle sql-update

我需要使用group by在特定属性上更新一个表,然后更新同一个表。

这是我想要实现的目标

样本记录:

表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_key是奇数,那么我必须将所有偶数翻转为偶数 - 1和奇数将保持不变。 att_key(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

我很难得到这个逻辑。寻求帮助/建议

...谢谢

2 个答案:

答案 0 :(得分:1)

您可以使用窗口功能执行此操作。这种方法使用余数的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
                 );

答案 1 :(得分:1)

Results

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
);

查询1

SELECT *
FROM   ABC

<强> Demo

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