これらの質問とよく似てい
ます。MSSQLCreateTemporaryTableの列名は、別のテーブルの行の値から取得されます。
Oracleでも同じことを行う必要がありますが、この新しいテーブルに、特定の方法で編成された別のテーブルのデータを入力する必要もあります。例:
テーブルユーザー
|id|name |
----------
|1 |admin|
|2 |user |
テーブルuser_data_cols
|id|field_name|field_description|
---------------------------------
|1 |age |Your age |
|2 |children |Your children |
テーブルuser_data_rows
|id|user_id|col_id|field_value|
-------------------------------
|1 |1 |1 |32 |
|2 |1 |2 |1 |
|3 |2 |1 |19 |
|4 |2 |2 |0 |
私が欲しいのは、SQLだけを使用して、次のようなテーブルを作成することです。
|user_id|age|children|
----------------------
|1 |32 |1 |
|2 |19 |0 |
他のテーブルのデータから開始します(時間の経過とともに変化する可能性があるため、新しいフィールドが追加された場合は新しいテーブルを作成する必要があります)そのようなことも可能ですか?これは多くの優れた慣行に反するかもしれないと思いますが、仕方がありません...
比較のために、ここにあなたのリンクからの答えがあります:
SELECT
CONCAT(
'CREATE TABLE Table_2 (',
GROUP_CONCAT(DISTINCT
CONCAT(nameCol, ' VARCHAR(50)')
SEPARATOR ','),
');')
FROM
Table_1
INTO @sql;
PREPARE stmt FROM @sql;
EXECUTE stmt;
次に、Oracle11gでも同じことを行います。
DECLARE
stmt varchar2(8000);
BEGIN
SELECT 'CREATE TABLE Table_2 ('||
(SELECT
LISTAGG(nameCol, ', ') WITHIN GROUP (ORDER BY nameCol) "cols"
FROM
(SELECT DISTINCT nameCol||' VARCHAR2(50)' nameCol FROM table_1) table_x)||
')'
INTO stmt
FROM DUAL;
EXECUTE IMMEDIATE stmt;
END;
/
'sqlのみを使用して'を使用してこれを実行できるかどうかを尋ねましたが、私の答えはPL / SQLブロックを使用しています。
同様の戦略を使用して、このようなテーブルにデータを入力できます。他の人が指摘しているように、解析時に列を知っている必要があります。その制限を回避するには、次のような戦略に従うことができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加