sql - 列更新 Oracle SQL

标签 sql oracle

我有以下格式的数据:

Tran No   Date        Store ID   Register ID  Tender
  01      23-10-2015    1000        001        CASH
  01      23-10-2015    1000        001        CRDT
  02      23-10-2015    1000        001        CASH
  02      23-10-2015    1000        001        GIFT

表中已添加新列 (Tran Seq)

这样新数据就会变成这样

Tran No   Date        Store ID   Register ID  Tender   Tran Seq   
  01      23-10-2015    1000        001        CASH       0
  01      23-10-2015    1000        001        CRDT       1
  02      23-10-2015    1000        001        CASH       0
  02      23-10-2015    1000        001        GIFT       1

对于每个相同的 TRAN NO、DATE、STORE ID 和 REGISTER ID,每个行项目都会在 Tran Seq 字段中获得一个新的序列号。

如何实现上述结果?

最佳答案

您可以使用ROW_NUMBER()分析函数:

例如,

设置

CREATE TABLE t
    (tran_no NUMBER, 
    "DATE" VARCHAR2(10),
     store_id NUMBER, 
     Register_ID NUMBER, 
     Tender varchar2(4));

INSERT ALL 
    INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
         VALUES (01, '23-10-2015', 1000, 001, 'CASH')
    INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
         VALUES (01, '23-10-2015', 1000, 001, 'CRDT')
    INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
         VALUES (02, '23-10-2015', 1000, 001, 'CASH')
    INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
         VALUES (02, '23-10-2015', 1000, 001, 'GIFT')
    INTO t (tran_no, "DATE", store_id, Register_ID, Tender)
         VALUES (02, '23-10-2015', 1000, 001, 'CRDT')
SELECT * FROM dual;

查询

SQL> SELECT t.*,
  2    row_number() OVER(PARTITION BY tran_no,
  3                                   "DATE",
  4                                   store_id,
  5                                   register_id
  6                      ORDER BY tender) - 1 tran_seq
  7  FROM t;

   TRAN_NO DATE         STORE_ID REGISTER_ID TEND   TRAN_SEQ
---------- ---------- ---------- ----------- ---- ----------
         1 23-10-2015       1000           1 CASH          0
         1 23-10-2015       1000           1 CRDT          1
         2 23-10-2015       1000           1 CASH          0
         2 23-10-2015       1000           1 CRDT          1
         2 23-10-2015       1000           1 GIFT          2

SQL>

注意:

  1. 列名称之间不能有空格。我用下划线代替。

  2. 您不能使用 Oracle 关键字。如果要使用,那么就需要使用双引号。例如,“日期”列。请记住,您需要在引用的所有地方使用双引号。

来自 Database Object Naming Rules 的文档:

A quoted identifier begins and ends with double quotation marks ("). If you name a schema object using a quoted identifier, then you must use the double quotation marks whenever you refer to that object.

更新

OP 希望使用生成的序列更新新列。您可以使用MERGE语句。

SQL> ALTER TABLE t ADD tran_seq NUMBER;

Table altered.

SQL> MERGE INTO t
  2  USING(
  3  SELECT TRAN_NO, "DATE", STORE_ID, REGISTER_ID, TENDER,
  4    row_number() OVER(PARTITION BY tran_no,
  5                                   "DATE",
  6                                   store_id,
  7                                   register_id
  8                      ORDER BY tender) - 1 tran_seq
  9  FROM t
 10  ) s
 11  ON (t.tran_no = s.tran_no
 12      AND t."DATE" = s."DATE"
 13      AND t.store_id = s.store_id
 14      AND t.register_id = s.register_id
 15      AND t.tender = s.tender
 16      )
 17  WHEN MATCHED THEN
 18     UPDATE SET t.tran_seq = s.tran_seq
 19  /

5 rows merged.

SQL> SELECT * FROM t ORDER BY tran_no, tran_seq;

   TRAN_NO DATE         STORE_ID REGISTER_ID TEND   TRAN_SEQ
---------- ---------- ---------- ----------- ---- ----------
         1 23-10-2015       1000           1 CASH          0
         1 23-10-2015       1000           1 CRDT          1
         2 23-10-2015       1000           1 CASH          0
         2 23-10-2015       1000           1 CRDT          1
         2 23-10-2015       1000           1 GIFT          2

关于sql - 列更新 Oracle SQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32603653/

相关文章:

sql - 您可以对同一行中的值运行 Oracle 的 AVG() 函数吗?

android - SqlLiteDatabase.query 按日期排序的列不起作用

mysql - 具有多个表的复杂sql查询

sql - Oracle 导出数据库结构的 SQL

c - 用C从oracle数据库中获取时间戳数据

oracle - 如何从oracle数据库中删除名为 "BIN$c+eOnMB3RbKSEfg/rsxtAQ==$0"的奇怪表?

oracle - 在快速刷新物化 View 中使用非确定性函数真的被禁止吗?

SQL Server 对多个表的嵌套查询

SQL XML 选择 where 子句

sql - 更改我的主键列种子时出现问题