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 |
---|---|---|---|---|---|
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 |
---|---|---|---|---|---|
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 |
---|---|---|---|---|---|
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 帮助 - 检测指定值列表中的更改的主要内容,如果未能解决你的问题,请参考以下文章