因此,这可能更多地是一个关于MySQL中的joins如何工作的理论问题,但我希望得到一些指导。
假设我有三个表,表a、b和c,其中表a和b是事实表,表c是表b的维度表。如果我想要将表b左连接到表a (我想保留表a的所有内容,但也想要匹配表b中的内容),即使表b被左连接,我仍然可以将表c内连接到表b吗?或者我必须将表c连接到表b?或者,这两种方法在所有意图和目的上都会产生相同的结果吗?
select a.column, c.name
from tablea a
left join tableb b on a.id = b.id
inner join (?) tablec c on b.name_id = c.name发布于 2015-02-19 02:21:41
MySQL支持的语法允许您实现您想要的功能:
select a.column, c.name
from
tablea a
left join
tableb b
inner join tablec c on b.name_id = c.name
on a.id = b.id
;在这种情况下,表tableb和tablec首先被联接,然后它们的联接结果被外联接到tablea。
但是,最终的结果集将与@simon at rcl's solution相同。
发布于 2015-02-19 02:10:30
在这种情况下,如果没有tableb的tablec条目,则整个连接将失败,并且将不包括tablea行。要包括tablsa条目,您需要将tablc的连接设置为左连接:
select a.column, c.name
from tablea a
left join tableb b on a.id = b.id
left join tablec c on b.name_id = c.name这样,即使没有匹配的tableb行,也会得到每个tablea行,当没有tablec行时,还会得到每个tablea和tableb。
发布于 2015-02-19 02:32:33
就SQL而言,连接顺序是无关紧要的(连接条件所暗示的任何顺序除外)。就像这样
select *
from t1
left join t2 on t2.t1_id = t1.id
join t3 on t3.id = t1.t3_id完全相同于
select *
from t1
join t3 on t3.id = t1.t3_id
left join t2 on t2.t1_id = t1.id下面是select查询如何工作的概念模型。当然,需要注意的是,由于第1步所暗示的性能影响,只有最简单的SQL实现才会真正做到这一点。然而,结果就像您执行了下面的步骤一样。
from子句中指定的所有表的笛卡尔乘积。这是您的候选结果集。where子句中指定的标准以进一步缩小结果集的范围。注意:第2步和第3步中的区别可能会更改结果集,具体取决于特定测试是放在where子句中还是放在join条件中。这不是内部连接的问题,但是对于外部连接,测试的位置可以实质性地改变结果。不要问我是如何知道这一点的。
group by子句中指定的条件(如果有)将结果集划分为多个组。
group by子句)及其聚合函数的值组成。通过应用having子句中指定的条件(如果有),
order by子句中指定的条件对其进行排序。https://stackoverflow.com/questions/28590173
复制相似问题