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 )のレコードを探しています。r1table_d

次の結合では、メイン インデックス ( table_r)が前の結合からのレコードの親インデックス ( ) と一致する( )の 2 番目のコピーでレコードを探しています。r2r_idparent_id

次に、 ( )LEFT JOINの 3 番目のコピーを使用して、前の結合のと単純に一致させようとしています。この最も外側の結合の考え方は、 からすべてのレコードを取得することですが、さらに条件 (まだクエリには含まれていません) を使用して selectと同等のことを行い、 のどのレコードが を持っているかを判断します。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 に答える