我想我可能在其他地方看到过这个讨论,但找不到。 我的问题是,如果我们有 3 个表:A、B 和 C。B 和 C 之间的关系是 INNER JOIN,而 A 和 B 之间的关系是 LEFT JOIN。
我看到有人以两种不同的方式对此提出质疑。 第一个是:
SELECT *
FROM A
LEFT JOIN B ON A.b_id = B.b_id
LEFT JOIN C ON B.c_id = C.c_id
第二个是:
WITH cte AS
(
SELECT *
FROM B
INNER JOIN C ON B.c_id = C.c_id
)
SELECT *
FROM A
LEFT JOIN cte ON A.b_id = cte.b_id
我认为在大多数用例中输出都是相同的,但是谁能告诉我为什么第二个比第一个更好? 我意识到第二个可能会更高效,最初的 INNER JOIN 限制了后来的 OUTER JOIN 的外部表的大小,但我知道还有一个逻辑原因不执行第一个选项。
(并且,是的,我意识到这个查询永远不会运行,因为 cte 有两列名为 c_id 的列。但是,为了简洁起见,我使用了 *)
第二个不是优选的。在这种情况下不需要 CTE。