【问题标题】:What's the difference between a cross join and an inner join with identical filter?交叉连接和具有相同过滤器的内部连接有什么区别?
【发布时间】:2020-02-24 03:26:50
【问题描述】:
让我们看看cross join:
select c1, c2, c3
from t1
cross join t2
where t1.f1 = t2.f2
让我们看看inner join:
select c1, c2, c3
from t1
inner join t2
on t1.f1 = t2.f2
这两种说法在性能、功能和内存使用方面有什么区别?
【问题讨论】:
标签:
postgresql
inner-join
cross-join
【解决方案1】:
这两个查询在功能上是相同的,如下查询:
select c1, c2, c3
from t1, t2
where t1.f1 = t2.f2
以下是我个人的看法:
总是使用JOIN ... ON ... 或JOIN ... USING (...) 语法编写内连接。
优点是:
读者会立即清楚你在做什么以及连接条件是什么。
-
你永远不能忘记写一个连接条件,因为你必须写一个。
这可以保护您避免因为忘记了一些连接条件而返回 10 亿行而不是 10000 行的查询,这是初学者经常犯的错误。
另外请注意,虽然对于内部联接,在 JOIN 或 WHERE 子句中编写条件并不重要,但对于外部联接很重要。