什么是"left"和"right"table中间的SQL Join?
What is the "left" and "right" table in an intermediate SQL Join?
SELECT * FROM Table a
INNER JOIN Table b on a.ID = b.ID
LEFT JOIN Table c on a.ID = c.ID
LEFT JOIN Table d on c.Something = d.Something -- which is left vs right
LEFT JOIN Table e on b.Something = e.Something -- which is left vs right
这可能是一个愚蠢的问题,但这样我就可以消除这个大脑障碍,table 是 "left" 哪个 table 是 "right"我最近两次加入中的一个?这是由列表中与 "on" 相对应的第一个决定的吗?我可以编写查询并确保正确的结果,但只是在技术层面上难以理解它......在处理像上面的例子这样的中间 tables 时。
LEFT JOIN Table d on c.Something = d.Something
c在左,d在右
LEFT JOIN Table e on b.Something = e.Something
b在左,e在右。
您要加入查询的 table(在本例中为 d 和 e)是右边的,因此您要加入的上一个查询中的任何键都来自左边 table (c 和 b).
想象一下,每次添加 table 时,您都在构建水平层次结构。
在本例中,您从 FROM Table A
开始,因此它成为层次结构的顶层(位于最左侧)。
当你 INNER JOIN Table b
时,它变成了第二层,位于 Table A 的右边。在这个连接中,table A 在左边,table B 在左边对。
你的 LEFT JOIN
也是如此。
还值得注意的是,连接的 ON
子句中列的顺序无关紧要。
LEFT JOIN Table d on d.Something = c.Something
LEFT JOIN Table e on e.Something = b.Something
等同于:
LEFT JOIN Table d on c.Something = d.Something
LEFT JOIN Table e on b.Something = e.Something
因为 table 的添加顺序会影响它们在连接的哪一侧,而不是 ON
子句的顺序。
SELECT * FROM Table a
INNER JOIN Table b on a.ID = b.ID
LEFT JOIN Table c on a.ID = c.ID
LEFT JOIN Table d on c.Something = d.Something -- which is left vs right
LEFT JOIN Table e on b.Something = e.Something -- which is left vs right
这可能是一个愚蠢的问题,但这样我就可以消除这个大脑障碍,table 是 "left" 哪个 table 是 "right"我最近两次加入中的一个?这是由列表中与 "on" 相对应的第一个决定的吗?我可以编写查询并确保正确的结果,但只是在技术层面上难以理解它......在处理像上面的例子这样的中间 tables 时。
LEFT JOIN Table d on c.Something = d.Something
c在左,d在右
LEFT JOIN Table e on b.Something = e.Something
b在左,e在右。
您要加入查询的 table(在本例中为 d 和 e)是右边的,因此您要加入的上一个查询中的任何键都来自左边 table (c 和 b).
想象一下,每次添加 table 时,您都在构建水平层次结构。
在本例中,您从 FROM Table A
开始,因此它成为层次结构的顶层(位于最左侧)。
当你 INNER JOIN Table b
时,它变成了第二层,位于 Table A 的右边。在这个连接中,table A 在左边,table B 在左边对。
你的 LEFT JOIN
也是如此。
还值得注意的是,连接的 ON
子句中列的顺序无关紧要。
LEFT JOIN Table d on d.Something = c.Something
LEFT JOIN Table e on e.Something = b.Something
等同于:
LEFT JOIN Table d on c.Something = d.Something
LEFT JOIN Table e on b.Something = e.Something
因为 table 的添加顺序会影响它们在连接的哪一侧,而不是 ON
子句的顺序。