Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用分组方式进行更新_Sql_Oracle_Sql Update - Fatal编程技术网

Sql 使用分组方式进行更新

Sql 使用分组方式进行更新,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_键的一组数

我需要在特定属性上使用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_键的一组数字(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 |

令人惊叹的。这一逻辑应该有效。让我试试。我的桌子有很多行。可能我必须将其转换为合并。如果这已回答了您的问题,您可以将其标记为已接受以结束该问题(并将此答案或您认为有价值的任何其他答案向上投票)。感谢您的帮助。