如何在 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 中指定可选依赖项