21

我的测试似乎证实了这一点

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

映射b.ya.x,即字段仅按序号位置匹配,而不按名称匹配。情况总是如此,即我可以依赖这种行为吗?不幸的是,文档没有说明这一点(或者我没有找到)。

4

3 回答 3

17

没错,SQL Server 不会尝试对列名进行任何映射,因为您可以将任何别名应用于您喜欢的源数据。它将始终参考序数位置。

于 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

是的。这是因为没有使用序数位置,它只是按部分解决查询。首先它从 b 中选择,不考虑列名,因为 SQL 不使用列名解决问题(您可以连接不同的列名)。然后它将数据添加到 a,就像在 b 中指定选择一样。实际上,如果您更改顺序,它将以其他顺序插入;)..

于 2012-03-21T15:33:51.937 回答