You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将单条记录拆分为多条记录:数据表转日志表实现方案

将datatable数据转换为logtable日志记录

表结构定义

datatable(业务数据表)

CREATE TABLE datatable
(
   "DT_ID"                NUMBER (10, 0),
   "ASSIGNED"             NUMBER (1, 0) DEFAULT 0,
   "ASSIGNED_DATE_TIME"   DATE,
   "ASSIGNED_BY"          VARCHAR2 (7 BYTE),
   "ACCEPTED"             NUMBER (1, 0) DEFAULT 0,
   "ACCEPTED_DATE_TIME"   DATE,
   "ACCEPTED_BY"          VARCHAR2 (7 BYTE),
   "REJECTED"             NUMBER (1, 0) DEFAULT 0,
   "REJECTED_DATE_TIME"   DATE,
   "REJECTED_BY"          VARCHAR2 (7 BYTE)
);

logtable(操作日志表)

CREATE TABLE logtable
(
   dt_id            NUMBER (10, 0),      -- 关联datatable的DT_ID
   "ACTION_OWNER"   NVARCHAR2 (50),      -- 对应当前操作的执行人(如ASSIGNED_BY)
   "ACTION"         VARCHAR2 (50 BYTE),  -- 操作类型:ASSIGNED/REJECTED/ACCEPTED
   "ACTION_DATE"    TIMESTAMP (3),       -- 操作时间(对应各操作的DATE字段)
   "REMARK"         VARCHAR2 (200 BYTE)
);

数据转换SQL

使用UNION ALL将datatable单条记录拆分为多条日志记录,仅当对应操作状态为1(表示已执行该操作)时生成日志:

INSERT INTO logtable (dt_id, "ACTION_OWNER", "ACTION", "ACTION_DATE", "REMARK")
SELECT 
    "DT_ID",
    "ASSIGNED_BY",
    'ASSIGNED' AS "ACTION",
    CAST("ASSIGNED_DATE_TIME" AS TIMESTAMP(3)) AS "ACTION_DATE",
    NULL AS "REMARK"
FROM datatable
WHERE "ASSIGNED" = 1

UNION ALL

SELECT 
    "DT_ID",
    "ACCEPTED_BY",
    'ACCEPTED' AS "ACTION",
    CAST("ACCEPTED_DATE_TIME" AS TIMESTAMP(3)) AS "ACTION_DATE",
    NULL AS "REMARK"
FROM datatable
WHERE "ACCEPTED" = 1

UNION ALL

SELECT 
    "DT_ID",
    "REJECTED_BY",
    'REJECTED' AS "ACTION",
    CAST("REJECTED_DATE_TIME" AS TIMESTAMP(3)) AS "ACTION_DATE",
    NULL AS "REMARK"
FROM datatable
WHERE "REJECTED" = 1;

说明

  • 每个SELECT分支对应一种操作类型,通过WHERE条件过滤出已执行该操作的记录
  • 利用CAST将DATE类型转换为TIMESTAMP(3)类型,匹配logtable的字段类型
  • REMARK字段若有业务需求,可以根据实际情况补充内容,示例中设为NULL

内容的提问来源于stack exchange,提问作者coder11 b

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 14:42:03