1

与えられた

CREATE TABLE Addresses
    Id INT NOT NULL
    Zip NVARCHAR(5) NULL    
    ZipPlus4 NVARCHAR(9) NULL

CREATE TABLE ZipLookup
    Zip NVARCHAR(5) NULL    
    Code NVARCHAR(10) NULL

CREATE TABLE ZipPlus4Lookup
    ZipPlus4 NVARCHAR(9) NULL    
    Code NVARCHAR(10) NULL

そしてのようなデータ

Addresses
1 | 92123 | 921234444

ZipLookup
92123 | Type A

ZipPlus4Lookup
921234444 | Type B

次のようなクエリを作成することは可能ですか。

  • 一致する場合、アドレスの特定の行はZipPlus4Lookupに外部結合されます

    Addresses.ZipPlus4 = ZipPlus4Lookup.ZipPlus4

  • それ以外の場合、一致するものがある場合、アドレスの指定された行はZipLookupに外部結合されます

    Addresses.Zip = ZipLookup.Zip

  • それ以外の場合、どちらのテーブルも外部結合されません

平易な英語では、AddressesテーブルにはZip列とZipPlus4列があり、最も正確に一致するものを使用してコードを検索する必要があります。Zip + 4に一致するものがある場合は、その一致のコードを使用します。それ以外の場合は、Zip一致のコードを使用します。

共有しようとしたクエリがあればいいのですが、これではどこから始めればよいのかわかりません。

4

1 に答える 1

6

この基本的なクエリは機能します。

SELECT
   A.*,
   Code = IsNull(Z4.Code, Z.Code)
FROM
   dbo.Addresses A
   LEFT JOIN dbo.ZipPlus4Lookup Z4
      ON A.ZipPlus4 = Z4.ZipPlus4
   LEFT JOIN dbo.ZipLookup Z
      ON A.Zip = Z.Zip
      AND Z4.ZipPlus4 IS NULL;

または、次のようなものを試すことができます。

SELECT
   A.*,
   Z.Code
FROM
   dbo.Addresses A
   OUTER APPLY (
      SELECT TOP 1 Code
      FROM (
         SELECT 0, Code FROM dbo.ZipPlus4Lookup Z4
         WHERE A.ZipPlus4 = Z4.ZipPlus4
         UNION ALL
         SELECT 1, Code FROM dbo.ZipLookup Z
         WHERE A.Zip = Z.Zip
      ) X (Seq, Code)
      ORDER BY X.Seq
   ) Z;

それらは異なるパフォーマンス特性を持っているかもしれません。テストする価値があります。私の推測では、2番目のクエリは不要ですが、概念的にはもっと良くなる可能性があります。

SQLフィドルでこれらの動作を確認してください。

于 2013-02-11T23:32:42.847 に答える