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

Cartesian product of two tables: Oracle Sql Join On True

我想将 _BAR 连接到查询结果。

我的第一次尝试是这样的:

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.

的有效语法

Oracle(默认情况下)将空字符串视为 NULL。这是一个真正的痛苦。它不同于其他数据库。我想他们的论点是:"Well, we were doing it for years before ANSI defined NULL values." 很好,但那些年是 1980 年代。

无论如何,这个逻辑:

'' <> rhs.f

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

完全相同:

NULL <> rhs.f

这总是 returns NULL 并且在 WHERE 条件下被视为 not-true。

在 Oracle 中,将这种空虚表示为:

rhs.f is not null

除了 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