我的测试似乎证实了这一点
INSERT INTO a (x, y) SELECT y, x FROM b
映射b.y
到a.x
,即字段仅按序号位置匹配,而不按名称匹配。情况总是如此,即我可以依赖这种行为吗?不幸的是,文档没有说明这一点(或者我没有找到)。
我的测试似乎证实了这一点
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 中指定选择一样。实际上,如果您更改顺序,它将以其他顺序插入;)..