首页 > 解决方案 > 在使用合并之前验证只有 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 个表中只有一个有一个值

标签: sqlsql-server

解决方案


我可以对 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

推荐阅读