私のテストはそれを確認しているようです
INSERT INTO a (x, y) SELECT y, x FROM b
にマップb.y
しますa.x
。つまり、フィールドは名前ではなく序数の位置でのみ一致します。これは常に当てはまりますか?つまり、その動作に依存できますか?残念ながら、ドキュメントにはこれが指定されていません(または私はそれを見つけられませんでした)。
私のテストはそれを確認しているようです
INSERT INTO a (x, y) SELECT y, x FROM b
にマップb.y
しますa.x
。つまり、フィールドは名前ではなく序数の位置でのみ一致します。これは常に当てはまりますか?つまり、その動作に依存できますか?残念ながら、ドキュメントにはこれが指定されていません(または私はそれを見つけられませんでした)。
正解です。任意のエイリアスをソースデータに適用できるため、SQLServerは列名のマッピングを実行しません。常に序数の位置を参照します。
はい。それで合っています。
ステートメント内のフィールドの順序はINSERT INTO
、テーブル定義と一致する必要はありません。
ただし、のエイリアス/フィールド名は無視され、ステートメントSELECT
によって指定されたフィールドに値が挿入されます。INSERT INTO
CREATE TABLE test (
a AS INT,
b AS INT,
c AS INT
)
INSERT INTO
test (
b,
c,
a
)
SELECT
1 AS a,
2 AS b,
3 AS c
SELECT * FROM test
a | b | c
---+---+---
3 | 1 | 2
はい。序数の位置を使用していないため、パーツごとにクエリを解決しているだけです。まず、SQLは列名を使用して問題を解決しないため、列名を考慮せずにbから選択します(異なる列名の結合を作成できます)。次に、bでselectを指定するのと同じ方法で、データをaに追加します。実際、順序を変更すると、他の順序で挿入されます;)。