21

私のテストはそれを確認しているようです

INSERT INTO a (x, y) SELECT y, x FROM b

にマップb.yしますa.x。つまり、フィールドは名前ではなく序数の位置でのみ一致します。これは常に当てはまりますか?つまり、その動作に依存できますか?残念ながら、ドキュメントにはこれが指定されていません(または私はそれを見つけられませんでした)。

4

3 に答える 3

17

正解です。任意のエイリアスをソースデータに適用できるため、SQLServerは列名のマッピングを実行しません。常に序数の位置を参照します。

于 2012-03-21T15:33:37.680 に答える
13

はい。それで合っています。

ステートメント内のフィールドの順序は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
于 2012-03-21T15:37:13.230 に答える
3

はい。序数の位置を使用していないため、パーツごとにクエリを解決しているだけです。まず、SQLは列名を使用して問題を解決しないため、列名を考慮せずにbから選択します(異なる列名の結合を作成できます)。次に、bでselectを指定するのと同じ方法で、データをaに追加します。実際、順序を変更すると、他の順序で挿入されます;)。

于 2012-03-21T15:33:51.937 に答える