0

私は現在、現在の年に関連するデータセットを扱っています。各年に関連するデータは、別のテーブルに格納されています。データがクエリされる場合、UNION ALL クエリを使用して実行されます。

残念ながら、過去に提供されたデータ セットは、今年のものと同じスキーマを共有しておらず、一部のフィールドが追加され、一部は廃止され、その他は名前が変更されています。私はこれを制御できません。

この場合、スキーマが異なる場合、これらのテーブルに対して UNION ALL クエリを実行するにはどうすればよいですか? 違いはそれほど重要ではありませんが、問題を引き起こすのに十分な偏差があります。

助言がありますか?

すべての年にまたがるすべてのフィールドを含むすべてを 1 つの大きなテーブルにマージし、新しいフィールドが表示されるたびに追加しますか? それとも、これらのテーブルを別々に保持し続けますか?

4

1 に答える 1

2

まず、SELECT * で UNION を実行しないでください (実際には、UNION ALL の方がおそらく適切です)。

あなたはできる:

  • トークンのデフォルト/NULL値を使用して、特定の列を持たないセットに列を追加します
  • 現在「同じ」であるが互換性のない型を使用している列を変換する
  • わざわざ含めるほど一般的ではない列を除外するだけです

例えば:

DECLARE @a TABLE(d DATE, c INT, x FLOAT);

DECLARE @b TABLE(d DATETIME, c VARCHAR(32));

DECLARE @c TABLE(d DATE, x INT, y INT);

SELECT d, c = CONVERT(VARCHAR(32), c), x = CONVERT(INT, x) FROM @a
UNION ALL
SELECT CONVERT(DATE, d), c, x = NULL FROM @b
UNION ALL 
SELECT d, c = 'not supplied', x FROM @c;
于 2013-07-22T16:31:19.783 に答える