将 INSERT INTO 与多个 SELECT 语句结合使用

jla*_*497 3 sql sql-server-2008-r2

我正在尝试将几行插入到表中。这些行的几乎所有值都与同一个表上的另一组记录匹配,因此我很好奇是否可以编写带有多个 SELECT 语句的单个 INSERT 语句来插入多行。像这样的东西:

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
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Dr.*_*hno 5

您可以与 Union 连接,将它们连接到一个记录集中:

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
Run Code Online (Sandbox Code Playgroud)

  • 不,这不一定会做同样的事情——这会消除重复。建议“UNION ALL”,除非您*知道*您想要消除重复项。 (4认同)