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

  • 否则,如果存在匹配项,则 Addresses 中的给定行外部连接到 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;

它们可能具有不同的性能特征。值得测试。我的猜测是第二个查询是不必要的,但从概念上讲它仍然可以更好。

在 SQL Fiddle 中查看这些操作。

于 2013-02-11T23:32:42.847 回答