首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Oracle中连接表(多个外部连接)

在Oracle中连接表(多个外部连接)
EN

Stack Overflow用户
提问于 2011-08-25 23:12:56
回答 2查看 84.5K关注 0票数 7

我正在尝试将Informix查询转换为Oracle:

Informix查询如下所示:

代码语言:javascript
运行
复制
SELECT
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr 
FROM
    tab1 u, tab2 ud, 
OUTER (tab3 a, tab4 n, tab5 nd, tab6 r, OUTER (tab7 g, tab8 atr))
WHERE
    r.xx = n.xx AND
    n.nas = a.nas AND
    a.user = u.user AND
    a.ac = g.ac AND
    n.nas1 = nd.nas1 AND
    u.user1 = ud.user1 AND
    atr.sso = g.sso AND
    UPPER(atr.name) = 'NAME' AND
    u.id = 102 

Oracle查询如下所示:

代码语言:javascript
运行
复制
SELECT
    r.aa, n.bb, nd.cc,u.id, ud.dd, g.attr
FROM
    tab1 u
INNER JOIN tab2 ud ON
    u.user1 = ud.user1 AND
    u.id = 102
LEFT OUTER JOIN tab3 a ON a.user = u.user 
LEFT OUTER JOIN tab4 n ON n.nas = a.nas
LEFT OUTER JOIN tab5 nd ON  n.nas1 = nd.nas1 
LEFT OUTER JOIN tab6 r ON r.xx = n.xx

我不确定如何连接其他两个表。

有人能帮我吗?

EN

回答 2

Stack Overflow用户

发布于 2011-08-26 14:07:30

我相信查询应该是这样的:

代码语言:javascript
运行
复制
SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr
  FROM            tab1 AS u
       INNER JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102
  LEFT OUTER JOIN tab3 AS a ON a.user  = u.user 
  LEFT OUTER JOIN tab4 AS n ON n.nas   = a.nas
  LEFT OUTER JOIN tab5 AS d ON n.nas1  = d.nas1 
  LEFT OUTER JOIN tab6 AS r ON r.xx    = n.xx
  LEFT OUTER JOIN (SELECT g.attr, g.ac
                     FROM tab7 AS x
                     JOIN tab8 AS atr ON x.sso = atr.sso
                    WHERE UPPER(atr.name) = 'NAME'
                  )    AS g ON a.ac    = g.ac

我将别名'nd‘更改为'd’,将'ud‘更改为'v’,以便所有别名都是单字母的。Informix表示法中的嵌套OUTER(tab7 g, tab8 atr)本身就是一个内连接(就像我的版本中的子选择一样),但该结果集是使用a.ac进行外连接的。这就是重写的内容。

我在子查询中使用了WHERE子句;如果您愿意,WHERE条件可以留在ON子句中。优化器很可能会正确且等价地进行处理。类似地,可以将内连接中的AND u.id = 102放入WHERE子句中。同样,优化器可能会降低过滤条件以获得更好的性能。

请注意,子查询中的上部函数可能需要一个表-scan-除非您在UPPER(atr.name)上有一个函数索引。

重新审视这一点,查询的初始部分的音译是不准确的。

原始查询包含FROM子句:

代码语言:javascript
运行
复制
FROM tab1 u, tab2 ud, OUTER(tab3 a, tab4 n, tab5 nd, tab6 r, OUTER(tab7 g, tab8 atr))

tab3tab4tab5tab6是相互内部联接的,结果是外部联接到tab1tab2。类似地,tab8tab7是内联接的,但其结果是外联接到表3-6的内联接。我给出的原始答案(基于问题中的大纲答案)将用旧的Informix表示法表示,使用:

代码语言:javascript
运行
复制
FROM tab1 u, tab2 ud,
     OUTER(tab3 a, OUTER(tab4 n, OUTER(tab5 nd, OUTER(tab6 r, OUTER(tab7 g, tab8 atr)))))

因此,将原始查询转录为:

代码语言:javascript
运行
复制
SELECT r.aa, n.bb, nd.cc, u.id, ud.dd, g.attr
  FROM tab1 AS u
  JOIN tab2 AS v ON u.user1 = v.user1 AND u.id = 102
  LEFT OUTER JOIN
       (SELECT *
          FROM tab3 AS a ON a.user  = u.user 
          JOIN tab4 AS n ON n.nas   = a.nas
          JOIN tab5 AS d ON n.nas1  = d.nas1 
          JOIN tab6 AS r ON r.xx    = n.xx
          LEFT OUTER JOIN
               (SELECT g.attr, g.ac
                 FROM tab7 AS x
                 JOIN tab8 AS atr ON x.sso = atr.sso
                WHERE UPPER(atr.name) = 'NAME'
               )    AS g ON a.ac    = g.ac
       ) AS loj

遗留的问题是确保复杂的loj子查询中的列使用了正确的别名。请注意,在缺少LEFT、RIGHT或FULL的情况下,连接被假定为内连接;此外,如果指定LEFT、RIGHT或FULL,则外部连接是可选的。

另一个需要注意的细节是:旧式Informix外连接在筛选条件下的行为与标准SQL外连接的行为不同。这几乎不会有什么不同,但它有时可能很重要。总的来说,标准SQL外连接的行为通常是您想要的,但是如果您运行回归测试并发现答案之间存在差异,那么解释可能是老式的Informix外连接与新型的标准SQL外连接的处理方式不同。

票数 9
EN

Stack Overflow用户

发布于 2011-08-25 23:50:45

我会尝试添加以下内容:

代码语言:javascript
运行
复制
LEFT OUTER JOIN tab7 g ON a.ac = g.ac
LEFT OUTER JOIN tab8 atr ON g.sso = atr.sso AND UPPER(atr.name) = 'NAME'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7192838

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档