2

私の質問は、いくつかの背景があります:

テーブル メタデータ (列形式) に基づいていくつかの SQL クエリを生成する必要があり、結果は次のようになります。

TABLENAME1|COL1
TABLENAME1|COL2
TABLENAME2|COL1
TABLENAME2|COL2
TABLENAME2|COL3
TABLENAME3|COL1
TABLENAME4|COL1
TABLENAME4|COL2
... /*some other 1800 rows */

(ええ、それは順序付けられています。)必要なのは、最初の列に基づいてこのデータを転置することです。そのため、予想される出力は次のようになります。

TABLENAME1|COL1|COL2|NULL
TABLENAME2|COL1|COL2|COL3
TABLENAME3|COL1|NULL|NULL
TABLENAME4|COL1|COL2|NULL
/* less then 1800 rows ;-) */

Oracle SQL を使用することは可能ですか?

前もって感謝します!

4

2 に答える 2

2

呼び出しごとにクエリを生成するか、ハードコーディングされた max-column-count を使用する場合は、次のようにすることができます。

WITH tab AS
(
  SELECT table_name, column_name FROM user_tab_cols WHERE column_id <= 4
) -- user_tab_cols used to provide test data, use your table instead
SELECT MAX(c1) c1,
       MAX(c2) c2,
       MAX(c3) c3,
       MAX(c4) c4
  FROM (SELECT table_name,
               DECODE( column_id, 1, column_name ) c1,
               DECODE( column_id, 2, column_name ) c2,
               DECODE( column_id, 3, column_name ) c3,
               DECODE( column_id, 4, column_name ) c4
          FROM ( SELECT table_name,
                        column_name,
                        ROW_NUMBER() OVER ( PARTITION BY table_name ORDER BY column_name ) column_id
                   FROM tab
               )
       )
 GROUP BY table_name
 ORDER BY table_name

その形で入手できれば十分です

TABLENAME1|COL1,COL2
TABLENAME2|COL1,COL2,COL3

Tom Kyte のstraggを見てください。

于 2009-11-24T06:58:21.967 に答える
1

お探しのキーワードはpivot. その使用例を次に示します構文は一般的に MSSQL と同じように見えます。また、Oracle のドキュメントの URL がわからないので、MSDNのリンクを投げて、私よりも Oracle のページ レイアウトについて詳しい人が編集してドキュメントを指すようにしてくれることを期待します。 .

EDIT:Oracleのドキュメント、ピボットを十分な回数検索すると、詳細が表示されます。

于 2009-11-24T05:37:14.437 に答える