作为替换使用速度非常慢的嵌套选择的旧代码的过程的一部分,我最终得到了一个如下所示的查询:
SELECT r3.r_id AS r3_id, r2.r_id AS r2_id, r1.r_id AS r1_id
FROM
table_r r3
LEFT JOIN (
table_r r2
INNER JOIN (
table_r r1
INNER JOIN table_d d ON r1.r_id = d.r_id
) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id
WHERE d.d_id = 3
因此,在最里面的联接中,我正在查找table_r
(复制r1
)中与table_d
的记录子集有关系的记录。
在下一次加入时,我正在查找主要索引(table_r
)与父索引({{1}匹配的r2
(r_id
)的第二个副本中的记录来自前一次加入的记录。
然后我尝试使用parent_id
LEFT JOIN
(table_r
)的第三个副本r3
,只需将r_id
与r_id
匹配以前的加入。这个最外层连接的想法是从table_r
获取所有记录,但是通过使用另一个条件(尚未在我的查询中)来确定相应的NOT IN
选择来确定哪些记录在r3
NULLs
r2_id
。{/ 1}
问题在于LEFT JOIN
没有给我全部table_r
。它给了我相同的记录子集,而没有最终的连接 - 换句话说,就像INNER JOIN
一样。因此,虽然我期待1208条记录,但我得到508条。
我知道我必须在这里做些事......
答案 0 :(得分:0)
如果您尝试这种情况会发生什么?
SELECT r3.r_id AS r3_id, r2.r_id AS r2_id, r1.r_id AS r1_id
FROM
table_r r3
LEFT JOIN (
table_r r2
INNER JOIN (
table_r r1
INNER JOIN table_d d ON r1.r_id = d.r_id AND d.d_id = 3
) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id
我所做的是将d.d_id = 3从where子句移动到INNER JOINs ON限定符。