5

どのテーブルから追加情報を取得するかを決定するために使用される「フラグ」として機能する列を含むテーブルがあります (つまり、値 1 は table1 から取得し、2 は table2 から取得するなど)。通常、インデックス/キーを使用してテーブルに参加するだけです。ただし、結合できるテーブルには、個別のテーブルに正規化できる情報が含まれていたため、列を使用して結合するテーブルを決定するという状況に陥りました。

ここで私の質問です。この列で生成された値に基づいて異なるテーブルを結合する最も効率的な方法は何ですか?

現在、このタスクを達成する方法を私が知っている2つの方法を次に示します。どちらも最適なソリューションではないと確信しています。

  1. メイン テーブル (結合するテーブルを決定する列の値を含む) から情報を取得し、アプリケーションのコードを通じて追加のクエリを送信して、残りの情報を取得します。

  2. 夢中になって、すべてのテーブルの列を返します(未使用であっても)。次に、コードを使用して、不要なテーブルの null を無視します。

4

3 に答える 3

1

私はそれが可能だと思います:

create table a (id integer, flag boolean);
create table b (id integer, value_b varchar(30));
create table c (id integer, value_c varchar(30));

insert into a values (1, true), (2, false);
insert into b values (1, 'Val 1'), (2, 'Val 2');
insert into c values (1, 'C 1'), (2, 'C 2');

select a.id,
       case when a.flag then b.value_b else c.value_c end AS value
  from a
  left join b using (id)
  left join c using (id);

あなたはそれを試すことができます。

もちろん、制限があります。

  • 列の数は固定されているためNULL、一部の値を省略する必要がある場合は、sを選択する必要があります。
  • CASE ... END列ごとにを作成する必要があります。
  • 結合されたすべてのテーブルを事前に知っておく必要があります。
  • パフォーマンスは最高ではないかもしれません。
于 2012-05-08T19:37:11.197 に答える
1

他のテーブルの内容によっては、UNION をお勧めします。返される列は、各クエリから同じである必要があります。したがって、次のようなことができます。

SELECT table1.title, tabel2.text FROM table1 INNER JOIN table2 ON table1.id=table2.id WHERE table1.key='2'
UNION
SELECT table1.title, tabel3.text FROM table1 INNER JOIN table3 ON table1.id=table3.id WHERE table1.key='3'

(SQL を微調整してスキーマと一致するようにし、実際に追加した間違いを回避します)

于 2012-05-08T04:32:50.433 に答える
1

間違いなくオプション 2 ではありません。データが必要ない場合は、取得しないでください。単純。データが必要ないときにテーブル (特に大きなテーブル) を結合するのは非常に非効率的です。オプション 1 を使用するか、動的 SQL を使用してクエリを作成することができます。次に、いくつかのテスト ケースをまとめて実行計画を実行し、クエリのパフォーマンスを確認します。

于 2012-05-08T04:31:32.947 に答える