type と呼ばれる列挙列を持つ normalize と呼ばれるテーブルがあると仮定しましょう
行に応じて (型が a、b、または c であると仮定しましょう)、型が何であれ、それに基づいて LEFT JOIN を実行したいと考えています。
したがって、タイプ = a の場合、テーブル a の LEFT JOIN .. タイプ = B の場合、テーブル b の LEFT JOIN ... など
これは効率的に行うことができますか?または、これはアプリケーション層で行う必要がありますか?
type と呼ばれる列挙列を持つ normalize と呼ばれるテーブルがあると仮定しましょう
行に応じて (型が a、b、または c であると仮定しましょう)、型が何であれ、それに基づいて LEFT JOIN を実行したいと考えています。
したがって、タイプ = a の場合、テーブル a の LEFT JOIN .. タイプ = B の場合、テーブル b の LEFT JOIN ... など
これは効率的に行うことができますか?または、これはアプリケーション層で行う必要がありますか?
はい、次のようなことができるはずです。
SELECT *
FROM parent
LEFT JOIN a ON (type = 'a' AND parent.id = a.id)
LEFT JOIN b ON (type = 'b' AND parent.id = b.id)
LEFT JOIN c ON (type = 'c' AND parent.id = c.id)
type
実際のデータと DBMS がどれほどスマートか (PK の下に存在するはずのインデックスを利用するか) に応じて、 にインデックスが必要な場合と必要でない場合があります。いずれにせよ、現実的な量のデータで測定してください。
問題は、 を使用してもSELECT table1.* FROM table1 LEFT OUTER JOIN table2
、結合を表示する必要がないにもかかわらず、エンジンが結合を評価することです。
したがって、私の意見では、2 つのオプションがあります。
** 以下を参照してください。IT バグのリスト内にあります **
計画を説明することで、自分が何をしているかの良い手がかりを得ることができます
クエリ:
SELECT
IF(t.type = a, ta.value,
IF(type = b, tb.value, IF(type = c, tc.value, td.value))
)
FROM
table t
LEFT JOIN type_a_table ta ON t.type = a AND ...
LEFT JOIN type_a_table tb ON t.type = b AND ...
LEFT JOIN type_a_table tc ON t.type = c AND ...
LEFT JOIN type_a_table td ON t.type = d AND ...
これが役立つかどうかはわかりませんが、おそらくユニオンを使用して探していることを実行します
select *
from BaseTable b left join TypeTableA a on b.id = a.id
union
select *
from BaseTable b left join TypeTableB b on b.id = b.id
一般的なアプローチの 1 つは、型を 1:1 の関係として格納することです。このアプローチでは、type enum 列はありません。ID が 1:1 拡張テーブルに存在するという事実は、そのタイプを示しています。
select *
from BaseTable b
left join
Type1Table t1
on t1.Id = b.Id
left join
Type1Table t2
on t2.Id = b.Id
したがって、エントリがinb
およびint1
のエンティティはタイプ 1 である必要があります。エントリが inb
および inのエンティティt2
はタイプ 2 です。このように、情報は 1 回だけ格納され、テーブルが「タイプ 1」と言う矛盾がありますが、一致する行がありませんでしt1
た。