sql - 在使用合并之前验证只有 1 个选定的列具有值
问题描述
我正在执行迁移并希望将 5 个表合并为 1 个。有一个“主”表包含 4 个子表的主键。
我想验证这些子表中只有 1 个有值,所以当我执行迁移时,我可以使用 coalesce 而不必担心数据丢失。
如何查询填充了超过 1 个子表的主表?
询问:
SELECT
rh.RevisionHardwareID, --master
rhd.RevisionHardwareID,
rhi.RevisionHardwareID,
rhz.RevisionHardwareID,
rhs.RevisionHardwareID
FROM RevisionHardware rh
LEFT JOIN RevisionHardware_Desktop rhd ON rhd.RevisionHardwareID = rh.RevisionHardwareID
LEFT JOIN RevisionHardware_iSeries rhi ON rhi.RevisionHardwareID = rh.RevisionHardwareID
LEFT JOIN RevisionHardware_zSeries rhz ON rhz.RevisionHardwareID = rh.RevisionHardwareID
LEFT JOIN RevisionHardware_Server rhs ON rhs.RevisionHardwareID = rh.RevisionHardwareID
-- where/having count of sub tables that are populated > 1
样本:
RevisionHardwareID RevisionHardwareID RevisionHardwareID RevisionHardwareID RevisionHardwareID
2 NULL NULL 2 NULL
3 NULL 3 NULL NULL
4 NULL 4 NULL NULL
5 NULL 5 NULL NULL
6 NULL NULL 6 NULL
第一列是“主”,并且总是有一个值,但我想确保其他 4 个表中只有一个有一个值
解决方案
我可以对 where 子句中的非空列求和。
SELECT
rh.RevisionHardwareID,
rhd.RevisionHardwareID,
rhi.RevisionHardwareID,
rhz.RevisionHardwareID,
rhs.RevisionHardwareID
FROM RevisionHardware rh
LEFT JOIN RevisionHardware_Desktop rhd ON rhd.RevisionHardwareID = rh.RevisionHardwareID
LEFT JOIN RevisionHardware_iSeries rhi ON rhi.RevisionHardwareID = rh.RevisionHardwareID
LEFT JOIN RevisionHardware_zSeries rhz ON rhz.RevisionHardwareID = rh.RevisionHardwareID
LEFT JOIN RevisionHardware_Server rhs ON rhs.RevisionHardwareID = rh.RevisionHardwareID
WHERE (
(CASE WHEN rhd.RevisionHardwareID IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN rhi.RevisionHardwareID IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN rhz.RevisionHardwareID IS NULL THEN 0 ELSE 1 END) +
(CASE WHEN rhs.RevisionHardwareID IS NULL THEN 0 ELSE 1 END)
) > 1
推荐阅读
- reactjs - 如何在 Next.js 中使用带有命名导出的动态导入?
- ios - 将盲文显示器连接到 iPhone
- java - Calculating modulo inverse in java
- javascript - 如何创建自定义 javascript 分页?
- azure - Azure 媒体服务:如何更改容器的命名约定
- ceph - 在保留 osd id 的同时更换磁盘
- sql - 如果下一行数据等于特定值,则检索数据
- division - 使用 cognos Report Studio 中的列表汇总字段计算除法
- cognos - 如何修改 Cognos 可视化中的最小 5 秒限制?
- python - python - print(*generator,
)