sql-server - 需要使 NULL=Value 评估为 TRUE
问题描述
我有一个我正在尝试创建的维度表,当所有其他非空字段匹配时,它需要具有 NULL 的记录被一个值覆盖。
此逻辑有效并显示了我所说的“null = Value 评估为 TRUE”的意思:
UPDATE A
SET
A.SSN = COALESCE(A.SSN, B.SSN)
,A.DOB = COALESCE(A.DOB, B.DOB)
,A.ID_1 = COALESCE(A.ID_1, B.ID_1)
,A.ID_2 = COALESCE(A.ID_2, B.ID_2)
,A.ID_3 = COALESCE(A.ID_3, B.ID_3)
,A.ID_4 = COALESCE(A.ID_4, B.ID_4)
FROM #TESTED1 A
INNER JOIN #TESTED1 B
ON (A.SSN = B.SSN
OR A.SSN IS NULL
OR B.SSN IS NULL)
AND (A.DOB = B.DOB
OR A.DOB IS NULL
OR B.DOB IS NULL)
AND (A.ID_1 = B.ID_1
OR A.ID_1 IS NULL
OR B.ID_1 IS NULL)
AND (A.ID_2 = B.ID_2
OR A.ID_2 IS NULL
OR B.ID_2 IS NULL)
AND (A.ID_3 = B.ID_3
OR A.ID_3 IS NULL
OR B.ID_3 IS NULL)
AND (A.ID_4 = B.ID_4
OR A.ID_4 IS NULL
OR B.ID_4 IS NULL)
WHERE A.ArbitraryTableID <> B.ArbitraryTableID
但是评估的记录越多,所需的时间越长,10k 记录需要 9 秒,100k 记录需要 9 分钟,等等。我正在尝试进行大约 3000 万条记录的初始加载,然后我将不得不在 MERGE 操作中评估整个表每天还有另外 10k 条记录。
例如,我需要将以下三行(都存在于同一个表上)组合成两行,并填充所有值:
不幸的是,成员可以有多个 ID,所以我不能指望这些 ID 中的任何一个是唯一的,甚至根本不存在来减少我的加入条件。
解决方案
根据您对我的评论的回复,我建议以下解决方案:
- 识别会员/客户的主记录
- 每个主记录的子记录存储各自的 ID
将您的UPDATE
陈述替换为
INSERT
s 将表中所有A
保证唯一的记录(例如 SSN)写入主表。INSERT
s 到子表中,用于表中A
具有非 NULL ID 属性的所有记录通过引用主记录主键的外键列将表中的记录标记
A
为已处理UPDATE
IDENTITY
INSERT
进入子表中的所有记录A
,您可以安全地分配给现有的主记录,然后再次设置 FK
此解决方案将解决由 5-way 导致的性能问题JOIN
,并将已处理的源记录标记为已处理。
推荐阅读
- android - 使用expo在android设备中打开反应本机应用程序时出错
- python - 根据给定条件将新列添加到现有数据框列
- django - django设置默认时区
- reactjs - 已解决:我试图在反应中将更新数据从父级传递给子级,但它没有在子组件的功能中更新
- database - Mongoose:TypeError:模式路径`guildId.type`的值无效,得到值“未定义”
- javascript - 仅用于数据结构和数据库的前端(React)解决方案
- python - 如何转换宽数据框以绘制特定数据
- regex - 正则表达式在文本文件中突出显示高于 85% 红色的百分位数
- flyway - 如何创建脚本或 Flyway 可以配置为每次使用 SQL 回调调用它?
- spartacus-storefront - 斯巴达克斯 2.1.9 在 2.0.0 之后的购物车效果问题