0

I have a SQL Server database, I need to store an unknown number of columns, so I have 2 tables like this:

  1. Table Master, with these columns: id, data1, data2 (fixed columns)
  2. Table unknown_fields with these columns: id_master_record, id_field, value_field

I do the query like this:

SELECT id, data1, data2, 
  (SELECT value_field FROM unknown_fields
    WHERE id_master_record = Master.id AND id_field = 1) AS data3
  (SELECT value_field FROM unknown_fields 
    WHERE id_master_record = Master.id AND id_field = 2) AS data4
  (SELECT value_field FROM unknown_fields 
    WHERE id_master_record = Master.id AND id_field = 3) AS data5
 ... SO for each 
FROM Master

I want to know whether there is a better way to do this query.

4

3 に答える 3

4

あなたはこれを試すことができます、それは少し速いかもしれません。両方をテストするのが最善です。2番目のテーブルをクラスタリングすると、(id_master_record, id_field)おそらく両方のクエリに役立ちます。

Select
  m.id,
  m.data1,
  m.data2,
  Max(Case u.id_field When 1 Then u.value_field End) As data3,
  Max(Case u.id_field When 2 Then u.value_field End) As data4,
  Max(Case u.id_field When 3 Then u.value_field End) As data5
From
  xmaster m
    Left Outer Join
  unknown_fields u
    On m.id = u.id_master_record
Group By
  m.id,
  m.data1,
  m.data2;

ピボットを使用することもできます

Select
  id,
  data1,
  data2,
  [1] as data3,
  [2] as data4,
  [3] as data5
From (
  Select
    m.id,
    m.data1,
    m.data2,
    id_field,
    value_field
  From
    Master m
      left outer join
    unknown_fields u
      On m.id = u.id_master_record
    ) as s
Pivot (
  max(value_field)
For 
    id_field In ([1], [2], [3])
) As p;

http://sqlfiddle.com/#!6/f9bca/11

于 2012-12-03T23:47:48.120 に答える
1

最初のクエリは、必要なことを行うのにかなり良い方法です。代わりに、クエリ実行プランを調べて、field_id のインデックスを上げることをお勧めします。これにより、クエリが高速化される可能性があります。

于 2012-12-04T10:47:38.120 に答える
0

別の可能な書き換え:

SELECT Master.id, Master.data1, Master.data2, 
       u3.value_field AS data3,
       u4.value_field AS data4,
       u5.value_field AS data5,
       ... so for each 
FROM Master
  LEFT JOIN unknown_fields AS u3
    ON  u3.id_master_record = Master.id 
    AND u3.id_field = 1
  LEFT JOIN unknown_fields AS u4
    ON  u4.id_master_record = Master.id 
    AND u4.id_field = 2
  LEFT JOIN unknown_fields AS u5
    ON  u5.id_master_record = Master.id 
    AND u5.id_field = 3
  ... so for each  ;

パフォーマンスを最適化したい場合は、さまざまな書き換えの実行計画を調べ、サーバーでデータを使用してテストを行う必要があります。テーブルのインデックスは、効率を高めるために不可欠です。特にテーブルのクラスター化インデックスの選択も、unknown_fieldsこのクエリに影響を与える可能性があります。

unknown_fieldsareと theの 2 つの可能性のあるインデックス(id_master_record, id_field, value_field)(順序は異なります):(id_field, id_master_record, value_field)

于 2012-12-04T00:11:27.783 に答える