SQL 帮助 - 检测指定值列表中的更改

Posted

技术标签:

【中文标题】SQL 帮助 - 检测指定值列表中的更改【英文标题】:SQL Help - Detect Changes Within Specified List of Values 【发布时间】:2021-11-03 22:19:03 【问题描述】:

我需要创建一个报告,以返回帐户类型已更改为该 account_types 列表或从该 account_types 列表中更改的客户帐户: ('CAM','CAMADP','CAMHD','CAMHDADP','DIST','DISTADP','GAM','GAMADP','LAM','LAMADP')。

假设我今天有这张桌子:

client account_type customer_org_ID insert_date update_date active_Y_N
Google GAM C000001 2006-05-04 09:15:34 2020-05-04 06:01:16 Y
Netflix LAM C000002 2006-05-04 09:15:34 2021-09-04 08:35:34 Y
Nordstrom DIST C000003 2006-05-04 09:15:34 2021-05-04 02:15:34 Y
Costco CAMHDADP C000004 2006-05-04 09:15:34 2021-05-04 09:36:34 Y
Boeing CAMHD C000005 2006-05-04 09:15:34 2021-05-04 12:15:45 Y
Samsung DISTADP C000006 2006-05-04 09:15:34 2020-06-15 01:10:16 Y

假设我明天上班,第 1、2、3、5 和 6 行发生了变化(以粗体显示)。

client account_type customer_org_ID insert_date update_date active_Y_N
Google CAM C000001 2006-05-04 09:15:34 2021-11-03 12:40:41 Y
Netflix DISTADP C000002 2006-05-04 09:15:34 2021-11-03 12:40:41 Y
Nordstrom GAMADP C000003 2006-05-04 09:15:34 2021-11-03 12:40:41 Y
Costco CAMHDADP C000004 2006-05-04 09:15:34 2021-05-04 09:36:34 Y
Boeing UNKWN C000005 2006-05-04 09:15:34 2021-11-03 12:40:41 Y
Samsung DISTADP C000006 2006-05-04 09:15:34 2021-11-03 12:40:41 N

我需要一个 sql 查询来返回这三行数据,因为我在开头提到的 account_types 列表中对其 account_type 进行了更新。

client account_type customer_org_ID insert_date update_date active_Y_N
Google CAM C000001 2006-05-04 09:15:34 2021-11-03 12:40:41 Y
Netflix DISTADP C000002 2006-05-04 09:15:34 2021-11-03 12:40:41 Y
Nordstrom GAMADP C000003 2006-05-04 09:15:34 2021-11-03 12:40:41 Y

我在 DB2 LUW 数据库中工作。

【问题讨论】:

对于这样的事情,您可能需要使用带有触发器的存档表来记录更改。 “你可以通过检查update_date 是否是最近的日期来知道”——那你为什么不能检查呢? @mustaccio 因为在我的数据库中,除了我在问题中列出的 3 列之外,还有更多列。其他列包括地址、联系信息、活动或非活动等。这意味着最近的 update_date 并不意味着 account_type 已更新。可能是客户的联系信息或他们的地址等发生了变化。 那么,当account_type 的新旧值不相等且至少不相等时,这是一个关于如何向此表添加另一个时间戳列并创建更新此列的before update of (account_type) 触发器的问题其中之一在您上面提供的列表中? @MarkBarinstein 请查看更新后的帖子... 【参考方案1】:

尝试将mytab 更改为您的真实表名。

ALTER TABLE mytab ADD UPDATE_AT_DATE TIMESTAMP;

CREATE OR REPLACE TRIGGER mytab_BUR
BEFORE UPDATE OF ACCOUNT_TYPE ON mytab
REFERENCING NEW AS N OLD AS O
FOR EACH ROW
WHEN 
(
--     O.ACCOUNT_TYPE IS DISTINCT FROM N.ACCOUNT_TYPE
--  AND
--  (
     O.ACCOUNT_TYPE IN ('CAM','CAMADP','CAMHD','CAMHDADP','DIST','DISTADP','GAM','GAMADP','LAM','LAMADP')
  OR N.ACCOUNT_TYPE IN ('CAM','CAMADP','CAMHD','CAMHDADP','DIST','DISTADP','GAM','GAMADP','LAM','LAMADP')
--  )
)
SET N.UPDATE_AT_DATE = CURRENT TIMESTAMP 
;

如果您的应用程序可能使用与它已有的相同值更新ACCOUNT_TYPE 列,并且您不想在这种情况下更新新的UPDATE_AT_DATE 列值,您可以取消注释掉的行。

【讨论】:

非常感谢!我要试试这个!【参考方案2】:

DB2 offre temporal tables 特性,从版本 10 开始引入。

不需要使用触发器,DB2 会自动管理这个

https://www.ibm.com/docs/en/db2/11.5?topic=tables-system-period-temporal

https://philipkgunning.files.wordpress.com/2013/02/traveling-through-time-with-db2-time-travel-query3apr13.pdf

【讨论】:

以上是关于SQL 帮助 - 检测指定值列表中的更改的主要内容,如果未能解决你的问题,请参考以下文章

SQL 从包含表名、列名和值列映射的数据表中将数据插入到多个表中,可以在源中更改

mysql 异常 急求帮助

如何获取标识值列 - SQL

在多值列中查找值

SQL:两个数据库,都有包含公共值列的表。如何查找丢失的行

在 SQL 中,如何为另一列的每个不同值创建新的值列?