Oracle SQL左联接,位置

FVCKYETI

我一直在看一本古老的大学SQL,偶然发现了一些我以前从未使用过并且不了解的语法。

SELECT * FROM TABLE1
LEFT JOIN TABLE 2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2), TABLE3 WHERE COLUMN1 LIKE '%%'
AND TABLE2.COLUMN1 = TABLE3.COLUMN1;

我对声明的这一部分表示满意,

SELECT * FROM TABLE1
LEFT JOIN TABLE 2 ON (TABLE1.COLUMN1 = TABLE1.COLUMN2)

但是在加入的第二部分中苦苦挣扎,

, TABLE3 WHERE COLUMN1 LIKE '%%'
AND TABLE2.COLUMN1 = TABLE3.COLUMN1;

有人能对这个外国概念大放异彩吗?

我最初的猜测是逗号是一种列出要联接的表的方法,而不是为要联接的每个表键入LEFT JOIN的方法,但是我现在不确定。

干杯。

戈登·利诺夫(Gordon Linoff)

逗号是一种老式join语法,几十年来已经过时了(但得到了完全支持)。join如今,几乎每个人都喜欢显式语法。

逗号在功能上等同于cross join完整的笛卡尔积。因此查询与以下内容相同:

SELECT *
FROM TABLE1 LEFT JOIN
     TABLE 2
     ON TABLE1.COLUMN1 = TABLE1.COLUMN2 CROSS JOIN
     TABLE3
WHERE COLUMN1 LIKE '%%' AND TABLE2.COLUMN1 = TABLE3.COLUMN1;

我不会写这样的查询。首先,COLUMN1 LIKE '%%'将产生一个错误,因为TABLE1并且TABLE3有一个具有该名称的列。并且,没有join条件TABLE2让我假设这些是错别字,您的意思是:

SELECT *
FROM TABLE1 LEFT JOIN
     TABLE2
     ON TABLE1.COLUMN1 = TABLE2.COLUMN2 CROSS JOIN
     TABLE3
WHERE TABLE1.COLUMN1 LIKE '%%' AND TABLE2.COLUMN1 = TABLE3.COLUMN1;

比较TABLE2.COLUMN1 = TABLE3.COLUMN1LEFT JOIN变为INNER JOIN,因为NULL值将导致该比较失败。没有外部联接TABLE3因此查询应等效于:

SELECT *
FROM TABLE1 LEFT JOIN
     TABLE2
     ON TABLE1.COLUMN1 = TABLE2.COLUMN2 JOIN
     TABLE3
     ON TABLE2.COLUMN1 = TABLE3.COLUMN1
WHERE COLUMN1 LIKE '%%' ;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章