1

我有两张桌子,CompanyAddresses& MyCompanyAddresses(更改名称以保护有罪者)。

CompanyAddresses保存公司的默认地址列表。这些记录是不可变的。用户可以更改公司地址的详细信息,但这些更改会被存储MyCompanyAddresses

如何从两个表中生成一个地址列表,不包括CompanyAddresses相应记录所在的记录MyCompanyAddresses

样本数据

公司地址

DatabaseId | Id    | Code | Name      | Street            | City      | Zip    | Maint Date
    1      | Guid1 | APL  | Apple     | 1 Infinite Loop   | Cupertino | 95014  | 11/1/2012
    2      | Guid2 | MS   | Microsoft | One Microsoft Way | Redmond   | 98052  | 11/1/2012

我的公司地址

DatabaseId | Id    | Code | Name      | Street            | City      | Zip    | Maint Date
    5      | Guid3 | APL  | Apple     | Updated Address   | Cupertino | 95014  | 11/6/2012

期望的结果

DatabaseId | Id    | Code | Name      | Street            | City      | Zip    | Maint Date
    2      | Guid2 | MS   | Microsoft | One Microsoft Way | Redmond   | 98052  | 11/1/2012
    5      | Guid3 | APL  | Apple     | Updated Address   | Cupertino | 95014  | 11/6/2012

我尝试了 MS SQL 的各种排列,UNION但无济于事EXCEPTINTERSECT另外,我也不相信JOIN's 是答案,但我很高兴被证明是错误的。

数据库设计可以更改,但最好保持不变。

4

1 回答 1

0

将 LEFT JOIN 与 COALESCE 结合使用。如果 JOIN 找到匹配项,COALESCE 将从覆盖的行中选择值。如果未找到匹配项,则返回原始值。

SELECT ca.DatabaseId, 
       COALESCE(mca.Id, ca.Id) AS Id,
       COALESCE(mca.Name, ca.Name) AS Name,
       COALESCE(mca.Street, ca.Street) AS Street,
       COALESCE(mca.City, ca.City) AS City,
       COALESCE(mca.Zip, ca.Zip) AS Zip,
       COALESCE(mca.MaintDate, ca.MaintDate) AS MaintDate,
    FROM CompanyAddresses ca
       LEFT JOIN MyCompanyAddresses mca
           ON ca.Code = mca.Code;
于 2012-11-06T21:56:32.423 回答