0

type と呼ばれる列挙列を持つ normalize と呼ばれるテーブルがあると仮定しましょう

行に応じて (型が a、b、または c であると仮定しましょう)、型が何であれ、それに基づいて LEFT JOIN を実行したいと考えています。

したがって、タイプ = a の場合、テーブル a の LEFT JOIN .. タイプ = B の場合、テーブル b の LEFT JOIN ... など

これは効率的に行うことができますか?または、これはアプリケーション層で行う必要がありますか?

4

4 に答える 4

1

はい、次のようなことができるはずです。

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 の下に存在するはずのインデックスを利用するか) に応じて、 にインデックスが必要な場合と必要でない場合があります。いずれにせよ、現実的な量のデータで測定してください。

于 2012-05-29T16:25:26.753 に答える
0

問題は、 を使用してもSELECT table1.* FROM table1 LEFT OUTER JOIN table2、結合を表示する必要がないにもかかわらず、エンジンが結合を評価することです。

したがって、私の意見では、2 つのオプションがあります。

  • 1 つ目: 適切なインデックスを使用し、許容可能な I/O を使用して、結合が効果的であると仮定し、次のクエリを使用します。

** 以下を参照してください。IT バグのリスト内にあります **

  • n 個の結合を行うと仮定すると、n は異なる型の数 (型ごとにテーブルがある場合) であり、多くのオーバーヘッドが発生し、アプリケーション レイヤーで 2 つのクエリを実行します。最初に型を取得し、次にスイッチ内で別のクエリを実行します。たとえば、右側のテーブルからデータを取得するための case ステートメント。

計画を説明することで、自分が何をしているかの良い手がかりを得ることができます

クエリ:

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 ...
于 2012-05-29T16:19:40.267 に答える
0

これが役立つかどうかはわかりませんが、おそらくユニオンを使用して探していることを実行します

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
于 2012-05-29T16:20:12.780 に答える
0

一般的なアプローチの 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た。

于 2012-05-29T16:08:42.440 に答える