Ответ 1
Правильно, SQL Server не пытается сопоставить имена столбцов, так как вы можете применить любые псевдонимы к исходным данным, которые вам нравятся. Он всегда будет ссылаться на порядковое положение.
Мои тесты, похоже, подтверждают, что
INSERT INTO a (x, y) SELECT y, x FROM b
отображает b.y
в a.x
, т.е. поля сопоставляются только по порядковому положению, а не по имени. Это всегда так, то есть я могу полагаться на это поведение? К сожалению, документация не указывает это (или я его не нашел).
Правильно, SQL Server не пытается сопоставить имена столбцов, так как вы можете применить любые псевдонимы к исходным данным, которые вам нравятся. Он всегда будет ссылаться на порядковое положение.
Да, вы правы.
Порядок полей в инструкции 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
Да. Это потому, что не использует порядковое положение, оно просто разрешает запрос по частям. Сначала выберите "Выбрать" из "b", не принимая имена столбцов учетных записей, поскольку SQL не разрешает действия с именами столбцов (вы можете создавать объединения разных имен столбцов). Затем он добавит данные в a, так же, как вы укажете выбор в b. Фактически, если вы измените заказ, он будет вставлен в другом порядке;)..