如何评估此查询? (我要问的是:db-engine将用于收集数据的逻辑是什么?)?
A:
SELECT tableA.* FROM tableA
LEFT JOIN tableB ON tableB.key1 = tableA.key1
INNER JOIN tableC ON tableC.key2 = tableB.key2
B:
SELECT tableA.* FROM tableA
INNER JOIN tableC
LEFT JOIN tableB
ON (tableB.key1 = tableA.key1) AND (tableC.key2 = tableB.key2)
C:
连接多个表的语法是什么? (例如A和B)
d:
连接顺序背后的逻辑是什么?
(如何在查询中组合不同的连接(左和内)?)
ANY酮
答案 0 :(得分:1)
SELECT tableA.* FROM tableA
LEFT JOIN tableB ON tableB.key1 = tableA.key1
INNER JOIN tableC ON tableC.key2 = tableB.key2
由于没有使用括号,因此应从左到右进行评估,因此:
SELECT tableA.*
FROM
(tableA LEFT JOIN tableB ON tableB.key1 = tableA.key1)
INNER JOIN tableC ON tableC.key2 = tableB.key2
这意味着您首先从表A中选择所有记录,如果存在,则匹配来自B的记录(外部联接)。然后,该结果集与C连接,但由于您加入了B.Key,所有之前B = null的记录现在将消失。 我很确定第一个连接可以是内部连接,给出相同的结果。
SELECT tableA.* FROM tableA
INNER JOIN tableC
LEFT JOIN tableB
ON (tableB.key1 = tableA.key1) AND (tableC.key2 = tableB.key2)
现在我们首先将来自A的每条记录与来自C(笛卡尔积)的每条记录交叉连接。 那个(可能是巨大的,可能没有意义的)结果集我们用来自B的数据扩展我们可以找到它(意味着我们在B与A或B匹配的地方添加记录)。
一般来说,在连接多个表时,只需逐步进行,并始终尝试实现您正在加入的内容。如有疑问,请使用括号:)