【问题标题】:How do I convert a "legacy" left outer join statement in Oracle?如何在 Oracle 中转换“旧版”左外连接语句?
【发布时间】:2011-04-29 09:35:37
【问题描述】:

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

我目前有一个 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

我正在尝试将此查询转换为“标准”LEFT JOIN 类型查询,因为我被告知较新版本的 Oracle 支持此语法。我已经尝试了基本的

LEFT OUTER JOIN ON A.AccountNo = G.AccountNo 

但这似乎不起作用。我的查询最终返回的行数比全部少 80 行。

谁能告诉我我遗漏了什么或如何正确格式化查询?

【问题讨论】:

    标签: sql oracle outer-join


    【解决方案1】:

    用途:

      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
    

    您看到的所有标有(+) 的内容都必须包含在 OUTER 连接条件中。在外部 JOIN 中,条件在连接之前应用。

    【讨论】:

    • 太棒了!像魅力一样工作。您能否进一步扩展“......在外部 JOIN 中,条件在连接之前应用”。我正试图更好地解决这个问题并向我的同事解释。
    • @Dillie-O:在这个例子中,verstartverend 标准被应用之前加入。它就像一个派生表,在进行 JOIN 之前过滤掉信息——这将产生与在 WHERE 子句中指定条件不同的结果。
    • 啊,我明白了。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-14
    相关资源
    最近更新 更多