1

2 つのテーブル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

MyCompanyAddresses

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役に立ちませんでした。また、 も答えだとは思いませんが、喜んで間違っていることが証明されます。EXCEPTINTERSECTJOIN

データベースの設計は変更できますが、同じままであることが望ましいです。

4

1 に答える 1

0

COALESCE と組み合わせて LEFT JOIN を使用します。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 に答える