2010-08-18 80 views
2

我是一名SQL新手,并试图弄清楚如何在一个SQL语句中插入多个表条目。 这里是我的代码:Multirow插入MS Access中的语句

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一起使用的任何建议?

+0

在您的第一个选择语句后,您开始省略姓氏值。 – JeffO 2010-08-18 18:31:17

+1

有人想问“为什么?”你可以跳过箍来让Access做到这一点,但它会更清晰地做到连续做几个INSERT。 – 2011-09-27 15:49:03

回答

1

你可以做这样的事情在MS Access,但你必须有一个表,你必须采取只有一行返回护理:

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和循环。

+0

您可以通过在select语句中包含“top 1”来确保只返回一行。例如,请参阅http://stackoverflow.com/questions/62504/。您可能想创建一个虚拟/实用程序表来执行此类技巧(如Oracle的DUAL表),而不是将它与包含“真实”数据的表混合。 – BIBD 2010-08-18 18:10:57

+0

联盟也会这样做。 UNION是独一无二的价值,UNION ALL不止是一种。 – Fionnuala 2010-08-18 18:51:35

0

访问将只在查询中运行一条SQL语句。通常在Access中,您可以从csv文件或电子表格加载数据。如果你真的想在SQL中做到这一点,请获取像iSQLviewer这样的客户端,它将连接到大多数数据库(我没有用Access试过它)并运行脚本。

+0

虽然Jet/ACE一次只限于一个SQL语句,但原始问题只列出一条SQL语句(INSERT INTO ... SELECT UNION ...),所以我不确定你的意思。 – 2010-08-19 17:40:25

+0

请原谅我不清楚。通常,多行插入由脚本中的多个插入语句生成。由于它无法执行多语句SQL脚本,Access在这方面存在一个真正的弱点。因此,我的评论是,使用SQL客户端执行脚本比在Access中解决它更容易。 – MikeAinOz 2010-08-21 23:10:36

+0

Access/Jet/ACE就是它 - 基于文件的数据库引擎。如果你选择了它,你不应该抱怨它不能做的事情,因为这是你做出选择的一部分。 – 2011-09-30 19:57:54

1

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

我通过使用类似于上面的Remou的方法得到了它的工作,但是您可能希望UNION ALL,否则两个相同的行将不会插入,因为UNION具有隐式的区别,我似乎需要一个外部选择,这是别名,否则它不会没有工作。另外当你如上所述的联合时,你需要一个Access中的表,所以我遵循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行和访问抱怨“查询太复杂”。我不得不把它放到49行才能让它成功插入。这表明您需要将您的插入批量分成更小的块,以便Access接受它。

因此,性能没有增加。这是不值得的麻烦,并需要在代码中的批处理逻辑,所以对我来说真的意味着我将在其他地方寻找性能增益。