如何将交叉连接的结果插入另一个表?

时间:2014-03-17 16:21:28

标签: sql sql-server

我正在使用此SQL创建交叉连接并将结果插入第三个表。任何想法为什么这不起作用?交叉连接在单独运行时有效。插入也可以独立运行,但不能在合并这些语句时运行。

INSERT INTO Person (FirstName, LastName) 
VALUES (Select fn.Name, ln.Name from FirstName as fn cross join LastName as ln);

2 个答案:

答案 0 :(得分:5)

您需要insert . . . select语法:

INSERT INTO Person(FirstName, LastName)
    Select fn.Name, ln.Name
    from FirstName as fn cross join LastName as ln;

答案 1 :(得分:2)

您无需使用VALUES部分插入这些实例:

INSERT INTO Person (FirstName, LastName) Values (Select fn.Name, ln.Name from FirstName as fn cross join LastName as ln)

以下SQL应该可以工作:(此代码实际上不起作用 - 请参阅下面的更新)

INSERT INTO Person
SELECT 
    FirstName = fn.Name, 
    LastName = ln.Name 
FROM FirstName AS fn 
CROSS JOIN LastName AS ln

使用SELECT语句插入值时,您不需要使用INSERT INTO tableName (...CSV of column names...) VALUES (... CSV of values ... )语法,该语法用于插入明确定义的(也不完全准确 - 请参阅下面的更新)

INSERT INTO Person 
    (FirstName, LastName)
VALUES
    ('John','Smith')
    ,('Jane','Doe')`

更新&代码修正由于评论添加Stuart Ainsworth:

由于收到的评论,以下代码已更新,我保留了上述代码以供参考(如何不执行!)并保持评论相关,但应注意指出并且在SQL小提琴中演示,以前的代码将不起作用。

可行的示例使用INSERT模板INSERT INTO (... CSV of values ...) SELECT ... FROM ... etc...。与先前所述不同,与INSERT INTO (... CSV of values ...)一样定义列不仅仅是用于显式插入,而是可以与select语句一起使用。 (以下内容现在与上面接受的答案几乎相同。)

INSERT INTO Person 
    (FirstName, LastName)
SELECT 
    fn.Name 
    ,ln.Name 
FROM FirstName AS fn 
CROSS JOIN LastName AS ln