两个表的笛卡尔积: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
我想将 _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