两个表的笛卡尔积:Oracle Sql Join On True

时间:2018-02-27 15:08:05

标签: sql oracle join cartesian-product

我想将_BAR连接到Query的结果。

我的第一次尝试是:

SELECT lhs.f||rhs.f as concat_bar FROM (
SELECT 'FOO' as f FROM DUAL) lhs 
LEFT JOIN 
(
SELECT '_BAR' as f FROM DUAL) rhs
ON ('' != rhs.f) 
; 

但我没有结果。我期待ON ('' != rhs.f)评估为true,因此我预计会产生一行:'FOO_BAR'。这是连接lhs和rhs表的笛卡尔积的结果。

我怎样才能JOIN on TRUE

我知道,对于具体问题,其他解决方案为

SELECT lhs.f||'_BAR' FROM (
SELECT 'FOO' as f FROM DUAL) lhs; 

是可能的。

我的问题是有效的语法,将两个表的笛卡尔积作为LEFT JOIN ON TRUE

2 个答案:

答案 0 :(得分:2)

Oracle(默认情况下)将空字符串视为NULL。这是一个真正的痛苦。它与其他数据库不同。我想他们的论点是:“好吧,在ANSI定义NULL值之前,我们已经做了多年。”很棒,但那些年是20世纪80年代。

无论如何,这个逻辑:

'' <> rhs.f

<>是SQL中的原始not-equals运算符。)

与:

完全相同
NULL <> rhs.f

这始终会返回NULL,并且在WHERE条件中被视为不为真。

在Oracle中,将此空虚表达为:

rhs.f is not null

答案 1 :(得分:1)

除了null的问题之外,还有你想要的交叉加入吗?

select lhs.f || rhs.f as concat_bar
from   ( select 'FOO' as f from dual ) lhs
       cross join
       ( select '_BAR' as f from dual ) rhs