将嵌套的Oracle样式查询(带子查询)转换为ANSI SQL

kpbpu008  于 2023-03-29  发布在  Oracle
关注(0)|答案(1)|浏览(121)

我有以下Oracle风格的查询,我必须将其转换为ANSI SQL查询,以便我可以理解它们是什么类型的连接:

SELECT
    ID,
    (SELECT TABLE1.COL1
        FROM VIEW1 TABLE1
        WHERE TABLE1.COL2 = (
            SELECT TABLE2.COL2
            FROM VIEW2 TABLE2
            WHERE TABLE2.ID = TABLE3.ID
        )
         AND TABLE1.COL3 = (
            SELECT TABLE2.COL3
            FROM VIEW2 TABLE2
            WHERE TABLE2.COL3 = TABLE3.COL3
        )
FROM VIEW3 TABLE3

这是我无法弄清楚的子查询。我已经尝试过阅读关于这个主题的Oracle文档(https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_10002.htm#i2066611),并尝试使用Google搜索示例或解释或这是什么样的连接,但我只能在网上找到关于更简单的连接的信息。我真的被困在这个问题上,希望得到任何帮助。
我也尝试在Oracle SQL Developer中转换此查询,但它不能为我转换子查询。

cig3rfwq

cig3rfwq1#

这是一个相关子查询;它不是联接,而是ANSI标准:

SELECT ID,
       ( SELECT v1.COL1
         FROM   VIEW1 v1
         WHERE  v1.COL2 = (SELECT COL2
                           FROM   VIEW2 v2
                           WHERE  v2.ID = v3.ID)
         AND    v1.COL3 = (SELECT v2.COL3
                           FROM   VIEW2 v2
                           WHERE  v2.COL3 = v3.COL3)
       )
FROM   VIEW3 v3

如果你想把它转换成JOIN,那么:

SELECT v3.id,
       v1.col1
FROM   view3 v3
       LEFT OUTER JOIN view1 v1
       ON (    EXISTS(
                 SELECT 1
                 FROM   view2 v2a
                 WHERE  v2a.col3 = v3.col3
                 AND    v2a.col3 = v1.col3
               )
           AND EXISTS(
                 SELECT 1
                 FROM   view2 v2b
                 WHERE  v2b.id = v3.id
                 AND    v2b.col2 = v1.col2
               )
           )
  • 注意:如果VIEW1可以有多行匹配,则这是不相同的,因为您的查询将返回TOO_MANY_ROWS异常,而带有LEFT OUTER JOIN的查询将返回多行;然而,对于不会导致异常的所有数据集,它们应该是相同的。
  • db〈〉小提琴here *

相关问题