MS Access 中的多行插入语句
Posted
技术标签:
【中文标题】MS Access 中的多行插入语句【英文标题】:Multirow insert into statement in MS Access 【发布时间】:2010-08-18 16:46:11 【问题描述】:我是一名 SQL 新手,正在尝试弄清楚如何在一个 SQL 语句中插入多个表条目。 这是我的代码:
INSERT INTO [Students](P_Id,FirstName,LastName,class,city,Phone)
SELECT 123,'Avi','Davis',2,'Tel-Mond','03-456789'
UNION
SELECT 234, 'Dani',2,'Dimona',' 02-111'
UNION
SELECT 345,'Itzik',3,'Ariel', '03-2222'
UNION
SELECT456, 'Koby', 3, 'Tel-Aviv', '03-333333'
UNION
SELECT 789,'Moshe' ,2 , 'Tel-Aviv','03-7777777'
我已经在各种教程的“帮助”下尝试了各种主题的变体,但到目前为止我没有尝试过任何工作。似乎每个不同的数据库程序的 SQL 用法略有不同。
关于如何更改我的代码以使其适用于 MS Access 的任何建议?
【问题讨论】:
在您的第一个 select 语句之后,您开始省略 lastname 值。 人们很想问“为什么?”您可以跳过障碍让 Access 执行此操作,但将其作为连续几个 INSERT 执行会更清晰。 【参考方案1】:你可以在 MS Access 中做类似的事情,但你必须有一个 from 表,并且你必须注意只返回一行:
INSERT INTO [Students](P_Id,FirstName, LastName, class, city,Phone)
SELECT 123 As P_ID, 'Avi' As FirstName, 'Davis' As LastName, 2 As Class,
'Tel-Mond' As City,'03-456789' As Phone FROM AnyTable
UNION
<...>
使用VBA和循环可以更容易。
【讨论】:
您可以通过在选择语句中包含“top 1”来确保只返回一行。有关示例,请参阅***.com/questions/62504。您可能想要创建一个虚拟/实用表来执行这样的技巧(如 Oracle 的 DUAL 表),而不是将其与包含“真实”数据的表混合。 UNION 也会这样做。 UNION 是独特的价值观,UNION ALL 不仅仅是一种。【参考方案2】:我想扩展这里给出的答案,因为今天我尝试了多行插入方法以提高我们应用程序的性能,但没有得到任何明显的改进。
我通过使用类似于上述 Remou 的方法使其工作,但您可能想要 UNION ALL 否则将不会插入两个相同的行,因为 UNION 具有隐式的不同,我似乎需要一个别名的外部选择,否则它没有不工作。此外,当您按照上述方式进行联合时,您需要在 Access 中创建一个 from 表,因此我遵循 Oracle 约定并创建了一个名为 DUAL 的单行表。
INSERT INTO [Students](P_Id,FirstName, LastName, class, city,Phone)
SELECT * FROM
(
SELECT 123 As P_ID, 'Avi' As FirstName, 'Davis' As LastName, 2 As Class,
'Tel-Mond' As City,'03-456789' As Phone FROM DUAL
UNION ALL
SELECT 456 As P_ID, 'FDA' As FirstName, 'RET' As LastName, 3 As Class,
'lima' As City,'03-456789' As Phone FROM DUAL
.
.
.
.
) as MyAlias
在我的示例中,我使它更简单,并创建了一个带有 varchar(50) 列的单列表。 我尝试了 1000 行,Access 抱怨“查询太复杂”。我必须把它减少到 49 行才能让它成功插入。这表明您需要将插入分批成更小的块,以便 Access 接受它。
因此,性能没有提高。这不值得麻烦,并且需要代码中的批处理逻辑,所以对我来说真的意味着我将在其他地方寻找性能提升。
【讨论】:
【参考方案3】:Access 只会在查询中运行一条 SQL 语句。通常在 Access 中,您将从 csv 文件或电子表格加载数据。如果您真的想在 SQL 中执行此操作,请获取 iSQLviewer 之类的客户端,该客户端将连接到大多数数据库(我没有使用 Access 尝试过)并运行脚本。
【讨论】:
虽然 Jet/ACE 确实一次仅限于一个 SQL 语句,但原始问题仅列出了一个 SQL 语句(INSERT INTO...SELECT UNION...),所以我不知道你的意思是什么。 请原谅我没有更清楚。通常,多行插入是由脚本中的多个插入语句生成的。 Access 在这里有一个真正的弱点,它不能执行多语句 SQL 脚本。因此,我认为使用 SQL 客户端执行脚本比尝试在 Access 中解决它更容易。 Access/Jet/ACE 就是这样——一个基于文件的数据库引擎。如果你选择了它,你不应该抱怨它不能做的事情,因为这是你做出的选择的一部分。以上是关于MS Access 中的多行插入语句的主要内容,如果未能解决你的问题,请参考以下文章