Sql MS Access中的多行insert into语句

Sql MS Access中的多行insert into语句,sql,ms-access,multirow,insert-into,Sql,Ms Access,Multirow,Insert Into,我是一名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'

我是一名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'
在各种教程的帮助下,我尝试了各种各样的主题变体,但到目前为止,我所尝试的都不管用。似乎每个不同的DB程序的SQL使用都略有不同


关于如何更改我的代码以使其与MS Access配合使用,有何建议

您可以在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和循环更容易。

Access在查询中只运行一条SQL语句。通常在Access中,您会从csv文件或电子表格加载数据。如果您真的想在SQL中实现这一点,请使用类似于iSQLviewer的客户端,它将连接到大多数数据库,我还没有使用Access尝试过它,而是会运行脚本。

我想扩展这里给出的答案,因为今天我尝试了多行插入方法,以提高应用程序的性能,但没有得到任何明显的效果改进

我使用了一种类似于上面Remou的方法来实现它,但您可能希望UNION所有其他两个相同的行都不会被插入,因为UNION有一个隐式distinct,我似乎需要一个别名为的外部选择,否则它就不起作用。此外,当您如上所述进行联合时,您需要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
在我的示例中,我使它更简单,并创建了一个带有varchar50列的单列表。 我尝试了1000行,Access抱怨查询太复杂。我必须将它减少到49行才能成功插入。这意味着您需要将插入内容批处理成更小的块,以便Access接受它


因此,业绩没有增加。它不值得这么麻烦,而且需要代码中的批处理逻辑,因此对我来说,这意味着我将在其他地方寻找性能提升。

通过在select语句中包含top 1,可以确保只返回一行。有关示例,请参见。您可能希望创建一个虚拟/实用程序表来执行类似Oracle的双表之类的操作,而不是将其与包含真实数据的表混合。UNION也可以这样做。UNION是唯一的值,UNION ALL不止一个。在第一个select语句之后,您开始忽略lastname值。人们不禁要问为什么?您可以跳转来获得访问权限,但将其作为一行中的多个插入项来执行会更清楚。虽然Jet/ACE一次仅限于一条SQL语句,但原始问题仅列出一条SQL语句插入到…SELECT UNION…,因此我不确定您的观点。请原谅我没有说得更清楚。通常,多行插入由脚本中的多个insert语句生成。Access在这里有一个真正的弱点,它不能执行多语句SQL脚本。因此,我的评论是,使用SQL客户机执行脚本比在Access中尝试绕过它更容易。Access/Jet/ACE就是它——一个基于文件的数据库引擎。如果你选择了它,你不应该抱怨它做不到的事情,因为这是你做出的选择的一部分。