Does INSERT INTO … SELECT … always match fields by ordinal position?

 ̄綄美尐妖づ 提交于 2019-12-05 10:46:32

问题


My tests seem to confirm that

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

maps b.y to a.x, i.e., the fields are matched only by ordinal position and not by name. Is this always the case, i.e., can I rely on that behaviour? Unfortunately, the documentation does not specify this (or I didn't find it).


回答1:


That is correct, SQL Server does not try to do any mapping of column names since you can apply any aliases to the source data that you like. It will always reference ordinal position.




回答2:


Yes, you are correct.

The order of the fields in the INSERT INTO statement does not need to match the table definition.

But the alias/field names of the SELECT will be ignored, and the values inserted into the fields named by the INSERT INTO statement.

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



回答3:


Yes. It's because is not using ordinal position, it's just resolving the query by parts. First it Select from b, not taking into accounts columns names, since SQL don't resolve things using column names (you can make joins of different columns names). Then it will add the data to a, in the same way you specify the select in b. In fact, if you change the order, it will be inserted in other order ;)..



来源:https://stackoverflow.com/questions/9807724/does-insert-into-select-always-match-fields-by-ordinal-position

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!