我正在尝试运行此查询,但无法理解其工作过程。
SELECT *
FROM TABLE1 T1
INNER JOIN TABLE2 T2 ON T1.ID = T2.ID
LEFT JOIN TABLE1 T3 ON T1.ID = T2.ID
table1包含3个连续ID为1,2,3的记录,table2包含4个连续ID为1,2,3,4的记录 还有一件事我还想知道,这个查询是从右到左执行的?我的意思是左连接过程首先执行然后内部连接?我根据查询执行计划说这个。
答案 0 :(得分:3)
这是您当前的查询:
SELECT *
FROM table1 t1
INNER JOIN table2 t2
ON t1.id = t2.id
LEFT JOIN table1 t3
ON t1.id = t2.id
第一次加入只是table1
和table2
之间的正常内联接。第二个连接是左连接,但ON
条件是多余的,我相信即使存在这种情况,行为也是相同的。这样做的原因是,对于中间表中的每个记录,连接条件t1.id = t2.id
在查询中的该点始终为真。因此,第二次加入似乎实际上是{strong>交叉加入与table1
。
通常,您的连接条件将涉及要连接的两个表。
答案 1 :(得分:2)
是的,它的工作方式就像交叉连接一样。如果这是你的意图,你应该正确地重写它。你在那里有什么误导和混淆(它是从哪里来的?)
select * from table1 t1
inner join table2 t2
on t1.id=t2.id
cross join table1 t3
评估表,过滤器,连接的顺序由查询计划决定(按CTRL-L)。这可能随时改变。你不应该担心这些命令的运行 - 你只需要知道无论它如何执行你都会得到相同的结果。如果查询规划器认为它会更快
,则可以选择一种方法而不是另一种方法