Всегда ли INSERT INTO ... SELECT ... сопоставляет поля по порядковому положению? - PullRequest
17 голосов
/ 21 марта 2012

Мои тесты подтверждают, что

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

сопоставляет b.y с a.x, то есть поля сопоставляются только по порядковому положению, а не по имени.Всегда ли это так, то есть могу ли я положиться на такое поведение?К сожалению, в документации это не указано (или я не нашел).

Ответы [ 3 ]

15 голосов
/ 21 марта 2012

Это верно, SQL Server не пытается сопоставлять имена столбцов, поскольку вы можете применять любые псевдонимы к исходным данным, которые вам нравятся. Он всегда будет ссылаться на порядковый номер.

9 голосов
/ 21 марта 2012

Да, вы правы.

Порядок полей в операторе 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
2 голосов
/ 21 марта 2012

Да.Это потому, что не использует порядковый номер, а просто разрешает запрос по частям.Сначала выберите «Выбрать из b», не принимая во внимание имена столбцов, поскольку SQL не разрешает вещи, используя имена столбцов (можно объединять имена разных столбцов).Затем он добавит данные в a, так же, как вы указали выбор в b.На самом деле, если вы измените порядок, он будет вставлен в другом порядке;) ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...