1

Teradata で 1 つの新しい列を作成し、別の列からこの新しい列にデータを移動しました。その後、古い列を削除しました。私が今やりたいことは、古い列があったテーブルの同じ場所に新しい列を移動することです。お聞きしたいのですが、それは可能ですか?

4

2 に答える 2

3

これはあなたの前の質問に関連しているので、私は同じ文脈で答えようとします。

いいえ、事後に列の順序を変更することはできません。既存のテーブルに新しい列を「追加」すると、テーブルの説明の最後に定義されます。物理テーブルに特定の順序で列を表示する必要がある場合は、テーブルを完全に再作成する必要があります。

ただし、任意の順序で列を表示するVIEWを作成できます。実際、このテーブルをある種のアプリケーションに使用する場合は、どのような場合でもVIEWを作成する必要があります(適切なアクセスロックを確立できるようにするため)。たとえば、COL_A、COL_B、およびCOL_Cの3つの列を持つMYTABLEという名前のテーブルがあり、それらを逆の順序で「表示」したいとします。

replace view MYDB.MYTABLE_V as
locking MYDB.MYTABLE for access
select COL_C, COL_B, COL_A
from MYDB.MYTABLE

「ビューの置換」を使用すると、ビューがまだ存在しない場合は作成され、存在する場合は置換されます。もちろん、これは、テーブルを変更した場合は、ビューを再作成する必要があることを意味します。安全のために、テーブル作成プログラムのコメントブロックにビュー定義を保持しています。

于 2012-08-13T13:54:32.217 に答える
3

ビジネス要件により、テーブル定義内の列の順序付けが強制されない限り (たとえば、timestamp がテーブル定義内の最後の列であるなど)、実際には問題になりません。適切な ROW ACCESS ロックを使用して、ビューの列を列 (1:1) にマップする V1 レイヤーがある場合、ビュー定義は常に、列の優先順序位置をエンド ユーザーと BI アプリケーションに公開できます。

列を並べ替える必要がある場合は、次の手順を実行します。

  1. CREATE TABLE MyDB.MyTable_希望する序数位置、列のデフォルト、値リストの圧縮を指定して送信します。
  2. COLLECT STATISTICS ON MyDB.MyTable_ FROM MyDB.MyTable; -- Migrate collected statistics
  3. INSERT INTO MyDB.MyTable_ SELECT /* Columns */ FROM MyDB.MyTable;
  4. RENAME MyDB.MyTable AS MyDB.MyTable1; RENAME TABLE MyDB.MyTable_ AS MyDB.MyTable;
  5. すべてが正常であることを確認した後、DROP TABLE MyDB.MyTable1;

ステップ 1 と 3 の代わりに、次のこともできます。

CREATE TABLE MyDB.MyTable_ 
       (/* Column Definitions in new Order */ ) AS 
       (SELECT /* New Column Ordering */ 
          FROM MyDB.MyTable)
       WITH DATA AND STATISTICS
       {UNIQUE} PRIMARY INDEX (/* Primary Index Columns */);

このアプローチを使用すると、統計情報が入力される場合とされない場合があります。これは、新しいテーブルが作成された後に確認する必要があります。

于 2012-08-13T13:27:00.643 に答える