如何在 Oracle 8i 中指定可选的 OUTER JOIN 条件

Posted

技术标签:

【中文标题】如何在 Oracle 8i 中指定可选的 OUTER JOIN 条件【英文标题】:How to specify optional OUTER JOIN condition in Oracle 8i 【发布时间】:2014-02-17 17:22:37 【问题描述】:

以下代码适用于 Oracle 版本 >= 9i,如 this fiddle 中所示

SELECT  T1.col1, T1.col3,count(T2.col1)
FROM    T1
LEFT JOIN T2
    ON T1.col3 = T2.col3
    AND ',' || T2.col2 || ',' like '%,' || T1.col1 || ',%'
GROUP BY T1.col1, T1.col3

但是根据Oracle Left Outer Join 文章,LEFT JOIN 似乎在Oracle 8i 中不可用 - 不幸的是我在 8i 中工作。

对于= 运算符,我知道等效代码

SELECT  T1.col1, T1.col3
FROM    T1
, T2
WHERE T1.col3 = T2.col3 (+)
--AND ',' || T2.col2 || ',' like '%,' || T1.col1 || ',%'

问题

但是我们如何为LIKE 运算符指定OUTER JOIN 条件。

注意:我相信,如果没有 (+),它将表现为该列的 INNER JOIN。

更新

以下查询给出ORA-00920: invalid relational operator 错误

SELECT  T1.col1, T1.col3,count(T2.col1)
FROM    T1
,T2
WHERE     T1.col3 = T2.col3(+)
    AND (',' || T2.col2 || ',') LIKE ('%,' || T1.col1 || ',%')(+)
GROUP BY T1.col1, T1.col3

【问题讨论】:

查看First Fiddle 和Second Fiddle 的结果。我需要列出 T1 中存在的所有记录(无论它们是否存在于 T2 中)。 我认为 Oracle 8i 是在 1998 年基于Oracle release dates 发布的,它应该足以满足我的要求。 工作代码 - sqlfiddle.com/#!4/1ae4a/10 【参考方案1】:

您可以尝试创建包含修改后的列的子查询,然后加入如下表:

Select  Mt1.T1_Col1, Mt1.T1_Col3,Count(Mt2.T2_Col1)
From
  (Select T1.Col1 As T1_Col1, T1.Col3 As T1_Col3, '%,' || T1.Col1 || ',%' As T1_Col1_New     From T1) Mt1, 
  (Select T2.Col1 As T2_Col1, T2.Col2 As T2_Col2, T2.Col3 As T2_Col3, ',' || T2.Col2 || ',' As T2_Col2_New From T2) Mt2
Where Mt1.T1_Col3 = Mt2.T2_Col3 (+)
And Mt1.T1_Col1_New Like Mt2.T2_Col2_New (+)
Group By Mt1.T1_Col1, Mt1.T1_Col3;

我在这里结合了内联子查询和外连接。

参考资料:

    http://www.orafaq.com/wiki/Inline_view http://www.oracle-base.com/articles/9i/ansi-iso-sql-support.php

【讨论】:

看起来很有希望Fiddle。您能否添加一些对此类解决方案的引用(最好来自 Stack Overflow)?【参考方案2】:

以下是来自fiddle的工作代码

Select  Mt1.T1_Col1, Mt1.T1_Col3,Count(Mt2.T2_Col1)
From
  (Select T1.Col1 As T1_Col1,
          T1.Col3 As T1_Col3,
          '%,' || T1.Col1 || ',%' As T1_Col1_New
   From T1) Mt1
,
  (Select T2.Col1 As T2_Col1,
          T2.Col2 As T2_Col2,
          T2.Col3 As T2_Col3,
          ',' || T2.Col2 || ',' As T2_Col2_New 
   From T2) Mt2
WHERE Mt1.T1_Col3 = Mt2.T2_Col3 (+)
And Mt2.T2_Col2_New (+) LIKE Mt1.T1_Col1_New
--Mt2 should be on the left side of LIKE
Group By Mt1.T1_Col1, Mt1.T1_Col3;

【讨论】:

【参考方案3】:

我知道你不想听到这个,但是一旦有人说他们正在使用 Oracle

【讨论】:

我认为Oracle 8i 是在1998 年基于Oracle release dates 发布的,它应该足以满足我的要求。 我认为有一个解决方法 - sqlfiddle.com/#!4/1ae4a/6 @Joseph B 虽然很容易做出这样的笼统声明,但您对他们的具体情况一无所知。他们仍然使用 8i 可能有充分的理由。

以上是关于如何在 Oracle 8i 中指定可选的 OUTER JOIN 条件的主要内容,如果未能解决你的问题,请参考以下文章

在 pypi python setup.py 中指定可选依赖项

pip 需求文件中的可选依赖项

Cmake 中的可选目标

Hibernate中带有命名查询的可选参数?

在 Oracle 数据库中解析 XML 文档分组元素(一些可选的)

如何将 SQL 开发人员/Toad 连接到 Oracle 8i