代码之家  ›  专栏  ›  技术社区  ›  Dillie-O

如何在Oracle中转换“legacy”左外部联接语句?

  •  3
  • Dillie-O  · 技术社区  · 14 年前

    我在一个Oracle数据库中有两个表(A和G),它们可以根据一个帐号连接在一起。一个需要注意的是,其中一个表(g)的记录比另一个表少80条。当我一起查询这两个表时,我需要获取所有的行,以便在缺少的80行的列中看到空数据。

    我目前有一个Oracle语句,它使用以下“遗留”语法执行左外部联接查询:

    SELECT A.AccountNo,
           A.ParcelNo,
           A.LocalNo,
           A.PrimaryUseCode, 
           A.DefaultTaxDistrict,
           RTRIM(G.Section),
           RTRIM(G.Township),
           RTRIM(g.Range)
    
      FROM tblAcct A, tblAcctLegalLocation G
    
     WHERE A.verstart <= '20100917999' AND A.verend > '20100917999' AND A.DefaultTaxDistrict = '2291' 
           AND (SUBSTR(A.AccountNo,1,1) = 'R' or SUBSTR(A.AccountNo,1,1)= 'I') 
           AND SUBSTR(a.ParcelNo,1,1)<> '7' and substr(a.ParcelNo,1,1)<>'8'
           AND A.AcctStatusCode IN ('A', 'T', 'E') 
           AND A.AccountNo = G.AccountNo(+)
           AND G.verstart(+) <= '20100917999' and G.verend(+) > '20100917999'
    ORDER BY A.ParcelNo, A.LocalNo
    

    我正试图将此查询转换为“标准”的左连接类型查询,因为有人告诉我Oracle的较新版本支持此语法。我试过基本的

    LEFT OUTER JOIN ON A.AccountNo = G.AccountNo 
    

    但这似乎行不通。我的查询结果返回的行数比完整数量少80行。

    有人能告诉我缺少什么或者如何正确格式化查询吗?

    1 回复  |  直到 14 年前
        1
  •  7
  •   OMG Ponies    14 年前

      SELECT a.AccountNo,
             a.ParcelNo,
             a.LocalNo,
             a.PrimaryUseCode, 
             a.DefaultTaxDistrict,
             TRIM(g.Section),
             TRIM(g.Township),
             TRIM(g.Range)
         FROM tblAcct A
    LEFT JOIN tblAcctLegalLocation g ON g.accountno = a.accountno
                                    AND g.verstart <= '20100917999' 
                                    AND g.verend > '20100917999'
        WHERE a.verstart <= '20100917999' 
          AND a.verend > '20100917999' 
          AND a.DefaultTaxDistrict = '2291' 
          AND SUBSTR(a.AccountNo,1,1) IN ('R', 'I') 
          AND SUBSTR(a.ParcelNo,1,1) NOT IN ('7', '8')
          AND a.AcctStatusCode IN ('A', 'T', 'E') 
     ORDER BY a.ParcelNo, a.LocalNo
    

    (+)