【发布时间】:2022-01-12 22:11:31
【问题描述】:
我在一些遗留的 sql 代码中遇到了这个问题,我想知道它是如何“在幕后”工作的。在下面的示例中,sql 引擎是将其视为带有过滤器的交叉连接还是“LIKE”关键字上的常规内部连接?
Select
t1.col1,
t2.col2
From
table1 t1,
table2 t2
Where t1.approved IS NULL
AND UPPER(NVL(t1.team, '%')) LIKE UPPER(NVL(t2.TEAM, '%'))
;
【问题讨论】:
-
是的,那是 1989 年的旧连接语法。它被称为“逗号分隔表”,现在非常不鼓励使用。
-
INNER JOIN是笛卡尔积的子集,其中输出仅包含满足连接谓词的那些行。这种连接的正式定义与笛卡尔积上的过滤器相同:select * from A join B on P(a,b) = [(a,b) : a ∈ A, b ∈ B, P(a,b) = 1]。explain plan可以看到幕后发生的事情 -
我想更大的问题是为什么这不是 Oracle 中的内部联接? Select t1.col1, t2.col2 From table1 t1, table2 t2 Where t1.approved IS NULL AND UPPER('%') LIKE UPPER('%') ;它们导致不同的解释计划。
-
这不是内部联接,因为您没有引用两个表中的列。但是如果你在表名之间显式地放置一个
inner join文本,由于同样的原因和上面提到的定义,它不会变成一个内连接。这只是一个约定,您也可以通过在右表的列上应用任何比较来将显式left join转换为inner。