Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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 - Fatal编程技术网

Sql 使用其他列更新列

Sql 使用其他列更新列,sql,oracle,Sql,Oracle,我使用PL/SQL,这是我的表 a | b | c | d ----------------------------- 1 | 1 | 2 | 1 | 2 | 2 | 1 | 2 | 2 | 1 | 3 | 2 | 1 | 3 | 2 | 2 | 2 | 2 | 2 | 4 |

我使用PL/SQL,这是我的表

 a   |    b    |    c   |   d
-----------------------------
 1   |    1    |    2   |
 1   |    2    |    2   |
 1   |    2    |    2   |
 1   |    3    |    2   |
 1   |    3    |    2   | 
 2   |    2    |    2   |
 2   |    4    |    2   |
 2   |    5    |    1   |
它将成为

 a   |    b    |    c   |   d
-----------------------------
 1   |    1    |    2   |  1
 1   |    2    |    2   |  2
 1   |    2    |    2   |  2
 1   |    3    |    2   |  3
 1   |    3    |    2   |  3
 2   |    2    |    2   |  1
 2   |    4    |    2   |  2
 2   |    5    |    1   |  
d列将从1开始,然后加1

如果b列开始更改

如果一列变得不同,d列将从1开始重复

我想用c等于2来更新d列

我知道如何在分区上使用行数,但我有两列关系。我不知道


怎么做?非常感谢。

不幸的是,Oracle更新中的数据操作令人痛苦

这正是您想要的:

update table t
    set d = (select count(distinct b)
             from table t2
             where t2.a = t.a and
                   t2.b <= t.b
            ) ;

在select查询中,您可以使用稠密的秩来执行此操作。

因为您不能在SET子句中使用窗口函数,我相信您需要使用嵌套查询来获取d的新值。以下内容适用于您:

UPDATE T
SET    T.d = D.d
FROM Table1 T
-- Join on a subquery to get the new 'd' values:
INNER JOIN (
  SELECT a, b, c, -- Get the identifiers for this row
         -- Get the new value for d
        dense_rank() over (partition by a 
                           order by b) as d
  FROM Table1
) D -- Map the new 'd' values back to the appropriate row
ON T.a = D.a and T.b = D.b AND T.c = D.c