【问题标题】:SQL find difference between two tableSQL查找两个表之间的差异
【发布时间】:2014-03-19 08:51:45
【问题描述】:

我需要比较两个表(表 A 为生产数据,表 B 为旧数据)之间的电子邮件记录(按电子邮件地址)以找出差异并将结果显示在“新建”、“删除”等列中.

如果存在于表A中,而不存在于表B中,则应标记为“新建”

否则如果存在于表B中而不是表A中,则应标记为“删除”

如果出现在两个表中,则应标记为“维护”

我想要这样的结果

DisplayName     LastName    Diremail    Result
==============================================
XXX             XXX         a@a.com     New
ABC             ABC         1@a.com     Delete
DDD             DDD         2@a.com     Maintain

我的代码如下:

SELECT  b.DisplayName,
        b.LastName,
        b.diremail,        
        Result = CASE WHEN a.DirEmail IS NULL THEN 'New'   
        when b.DirEmail IS null then 'delete'     
                    else 'Maintain'
                END
FROM    vHRIS_StaffDB b    
        LEFT JOIN HRIS_DL_Lists a
            ON a.DirEmail = b.DirEmail
WHERE (
a.DirEmail IS NULL
OR      a.DisplayName != b.DisplayName
)

但数据不正确,因为代码不返回应该“删除”的记录 (在表 b 中找到,不在表 a 中)

请指教。谢谢。

【问题讨论】:

  • 听起来您正在尝试同步两个数据库(或两个数据库中的至少两个表)。

标签: sql sql-server join compare


【解决方案1】:

听起来您需要完全加入而不是左加入。试试这个:

SELECT  coalesce(b.DisplayName, a.DisplayName) DisplayName,
        coalesce(b.LastName, a.LastName) LastName,
        coalesce(b.diremail, a.diremail) diremail,
        Result = CASE WHEN a.DirEmail IS NULL THEN 'New'   
        when b.DirEmail IS null then 'delete'     
                    else 'Maintain'
                END
FROM    vHRIS_StaffDB b    
        FULL JOIN HRIS_DL_Lists a
            ON a.DirEmail = b.DirEmail
WHERE (
a.DirEmail IS NULL
OR      a.DisplayName != b.DisplayName
)

【讨论】:

    猜你喜欢
    • 2015-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 2011-01-05
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多