2016-04-05 212 views
1

我试图在表格中插入多行。几乎所有这些行的值都与同一个表上的另一组记录相匹配,所以我很好奇我是否可以使用多个SELECT语句编写单个INSERT语句来插入多行。就像这样:对多个SELECT语句使用INSERT INTO

INSERT INTO table (col1, col2, col3, col4) 

SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 0 
SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 1 
SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 2 
SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 3 

这可能吗?最后,它应该插入4行,所有行都具有相同的NewRecordID,col4值为0-3,其他col值取自同一个表上相应的OldRecordID。当我运行它时,它只运行第一个INSERT SELECT语句,然后将其他运行作为它们自己的SELECT语句。我在连接这些东西时错过了什么?我总是可以多次运行它并每次更改值,但我想知道是否有办法避免这种情况。我欣赏和帮助或有用的提示。

感谢

回答

0

你可以与联盟,其加入他们到一个记录连接:

INSERT INTO table (col1, col2, col3, col4) 

SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 0 
union 
SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 1 
union 
SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 2 
union 
SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 = 3 
+2

不,这并不一定会做同样的事情 - 这将消除重复。建议'联盟所有',除非你知道*你想重复消除。 –

+0

谢谢!这工作,我用AB建议使用UNION ALL语句。我最终选择了里卡多C的解决方案,但这也很棒。我很欣赏快速反应! – jlarson497

1
INSERT INTO table (col1, col2, col3, col4) 

SELECT (newRecordID, col2, col3, col4) 
FROM table WHERE col1 = oldRecordID AND col4 IN(0,1,2,3) 
+0

太棒了!这工作。我结束了使用UNION ALL解决方案,因为我已经有了一堆SELECT语句。然后我删除了新条目并尝试了这种方式。可能会坚持这个解决方案,因为它节省了一点点空间。谢谢! – jlarson497

+0

@ jlarson497很高兴帮助。要么你选择了我的,要么是亚伦博士的,只是不要忘记接受一个作为答案;) –