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
  ) ON r2.r_id = r1.parent_id
) ON r3.r_id = r2.r_id
WHERE d.d_id = 3

所以在最里面的连接中,我正在寻找table_r(copy r1) 中的记录,这些记录与table_d.

在下一次连接中,我在 ( ) 的第二个副本中查找记录,table_rr2主索引 ( ) 与上一次连接中记录r_id的父索引 ( ) 匹配parent_id

然后我尝试使用( )LEFT JOIN的第三个副本进行 a ,只需与前一个联接的匹配即可。这个最外层连接的想法是从 中获取所有记录,然后通过使用进一步的条件(尚未在我的查询中)来确定中的哪些记录具有选择来执行等效的选择。table_rr3r_idr_idtable_rNOT INr3NULLsr2_id

问题是它LEFT JOIN并没有给我全部table_r。它给了我在没有最终连接的情况下获得的相同记录子集——换句话说,与INNER JOIN. 因此,虽然我期待 1208 条记录,但我得到了 508 条记录。

我知道我一定是在做一些古怪的事情……

4

1 回答 1

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 限定符。

于 2010-09-02T05:52:16.010 回答