1

以下のようなテーブルがあります。

       id |        cat |         one_above |        top_level | 
        0    'printers'          'hardware'        'computers'

このテーブルの列を行に転置する結果セットを返すクエリを、 unions を使用せずに記述できるようにしたいと考えています。これが意味することは、結果を次のようにしたいということです。

       id |          cat |
        0      'printers'
        0      'hardware'
        0     'computers'

これは MySQL で可能ですか? IDに基づいてインデックスを作成する検索エンジンにこれらをフィードしているため、アプリケーションレイヤーにドロップダウンしてこれを実行することはできません。他のさまざまな DBMS には、PIVOT や UNPIVOT のようなものがあります。私が見逃している何かへの洞察をいただければ幸いです。

マフムード

PS

これは簡単な作業ではないため、最後のオプションとしてデータベースの再正規化を検討しています。

ありがとう!

4

2 に答える 2

1

これは、The Art of SQLの284〜286ページから入手しました。

テーブル名が。であるとしましょうfoo

pivotまず、 :というテーブルを作成します。

CREATE Table pivot (
  count int
);

ピボットする列と同じ数の行をそのテーブルに挿入しますfoo。ピボットする列が3つあるのでfoo、ピボットテーブルに3つの行を作成します。

insert into pivot values (1);
insert into pivot values (2);
insert into pivot values (3);

foo次に、との間でデカルト結合を実行しpivot、を使用しCASEてカウントに基づいて正しい列を選択します。

SELECT foo.id, Case pivot.count
  When 1 Then cat
  When 2 Then one_above
  When 3 Then top_level
End Case
FROM foo JOIN pivot;

これはあなたが望むものを与えるはずです。

于 2009-12-05T10:49:39.727 に答える
0

かなり広範囲に掘り下げた後、私はあなたの答えが含まれているかもしれないし含まれていないかもしれないこのページに出くわしました。MySQLでは難しいですが、概念的な観点からは、describeを使用してこのように転置するクエリを作成できます(恐らく恐ろしいパフォーマンスになるでしょうが)。だから私たちはそれを正しい方法で行う方法を見つけることができると確信しています。

于 2009-12-05T10:32:26.837 に答える