【问题标题】:SQL Server: Select from two tables and insert into oneSQL Server:从两个表中选择并插入到一个
【发布时间】:2014-02-22 17:25:21
【问题描述】:

我有一个带有两个表变量(@temp 和@temp2)的存储过程。

如何从两个临时表中选择值(两个表变量都包含一行)并将它们全部插入到一个表中?

我尝试了以下方法,但没有成功,并且出现 SELECT 和 INSERT 语句的数量不匹配的错误。

DECLARE @temp AS TABLE
    (
        colA datetime,
        colB nvarchar(1000),
        colC varchar(50)
    )
DECLARE @temp2 AS TABLE
    (
        colD int
    )

...

INSERT INTO MyTable
    (
        col1,
        col2,
        col3,
        col4
    )
SELECT  colD FROM @temp2,
        colA FROM @temp,
        colB FROM @temp,
        colC FROM @temp

非常感谢您提供的任何帮助,蒂姆。

【问题讨论】:

  • 两个表变量都只有一行吗?这就是“所有临时列仅包含一个值”的意思吗?
  • 是的,我就是这个意思。

标签: sql sql-server multiple-instances multiple-tables insert-into


【解决方案1】:

由于两个表变量都有一行,您可以交叉连接它们。

INSERT INTO MyTable
            (col1,
             col2,
             col3,
             col4)
SELECT t.colA,
       t.colB,
       t.colC,
       t2.colD
FROM   @temp t
       CROSS JOIN @temp2 t2 

【讨论】:

  • 太完美了——我以前从未听说过。非常感谢。我会接受的。
  • @user2571510 CROSS JOIN 返回笛卡尔积顺便说一句。这是连接行的每个排列。如果两个表都有一行,则只有一个这样的排列。
  • 也感谢您的解释!
【解决方案2】:

如果您在两个表 @temp and @temp2 中只有一行,您应该使用它,因为这是一个笛卡尔积。

INSERT INTO MyTable(col1,col2,col3,col4)
  SELECT t.colA,
           t.colB,
           t.colC,
           t2.colD
    FROM   @temp t,@temp2 t2

【讨论】:

  • 我个人更喜欢明确的CROSS JOIN 语法。它更明显地表明了它的意图。
猜你喜欢
  • 2015-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多