【问题标题】:Inserting into 2 tables select result of a table SQL Server插入到 2 个表中选择表 SQL Server 的结果
【发布时间】:2011-02-24 03:33:28
【问题描述】:

如何将 select 语句的结果插入到 2 个表中。

我有一个包含多个数据的表格:

val1 val2 val3 .... valn
-------------------------
 12   21   54        78
 ..   ..    ..       ..

我有类似的东西: Select t1.val1, t1.val2, t2.val3, t2.val4 into table1 t1 , table2 t2 from tablename.

所以我希望将 val1、val2 插入到具有 2 个字段的新表中,例如:

tabble1:
id fieldvalue
1   val1
2   val2

val3 和 val4 也是如此。这个怎么实现

tabble2:
id fieldvalue
1   val3
2   val4

这可能吗?

【问题讨论】:

  • 它不能——不在单个 SQL 语句中。 INSERT 总是在一个表中 - 如果您需要填充两个表,则需要两个语句。
  • 您是否要规范化现有表?
  • 不是真的,只是拆分了它们的一些属性

标签: sql sql-server-2008


【解决方案1】:

诚然,很难理解您要完成的工作。如果您实际上是在尝试将行插入两个不同的表中,如 marc_s 所述,则必须使用两个插入语句。

但是,从您的示例来看,您可能不是尝试插入两个表,而是使用两个表插入到您转置数据的第三个表中。如果是这种情况,那么您可以在一条语句中完成:

Insert MysteryTable( Id, fieldvalue )
Select 1, val1
From Table1
Union All
Select 2, val2
From Table1
Union All
Select 3, val3
From Table2 --assuming these come from Table2. Isn't clear in the OP
Union All
Select 4, val4
From Table2 --assuming these come from Table2. Isn't clear in the OP

当然,如果 Table1 或 Table2 有很多行,那么您显然会在 MysteryTable 中获得许多具有相同 Id 值的行。

对 OP 的更改进行更新

鉴于您的说明,您可以完成您所寻求的,但需要两个与上述类似的查询。

Insert Table1( Id, fieldvalue )
Select 1, val1
From SourceTable
Union All
Select 2, val2
From SourceTable

Insert Table2( Id, fieldvalue )
Select 1, val3
From SourceTable
Union All
Select 2, val4
From SourceTable

生成您的 id 值的另一个变体是:

With NumberedItems As
    (
    Select val1 As val
    From SourceTable
    Union All
    Select val2
    From SourceTable
    )
Insert Table1(id, fieldname)
Select Row_Number() Over( Order By val ) As Num
    , val
From SourceTable

With NumberedItems As
    (
    Select val3 As val
    From SourceTable
    Union All
    Select val4
    From SourceTable
    )
Insert Table2(id, fieldname)
Select Row_Number() Over( Order By val ) As Num
    , val
From SourceTable

顺便说一句,在上面的例子中,我使用了Union All,但是如果你想规范化数据,你可能想要有不同的值。在这种情况下,您将使用Union 而不是Union All

【讨论】:

  • 对不起@Thomas,当我有多个列值时应用您的解决方案的方法是什么,例如 val1,val2,val3,val4....valn 我知道可以使用动态 sql ,但是如何?
  • 您的 2 个解决方案中哪一个更容易实现动态 sql?
  • @darkcminor - 由于您是在中间层组件中执行此操作(对吗?),这确实是一种推动。第二种解决方案的优点是它会自动为您创建序列号,假设这是您想要的。
【解决方案2】:

您不能使用单个插入语句从 1 列创建两行并且值来自不同的列。

假设 id 字段是一个自动递增的列,只需为每列创建一个插入语句。

insert into table1 (fieldname)
select val1 from tableName

insert into table1 (fieldname)
select val2 from tableName

insert into table1 (fieldname)
select val3 from tableName

insert into table1 (fieldname)
select val4 from tableName

【讨论】:

  • 那些不是更新语句,正如你所说的那样 - 这些是 INSERT 语句。在这种情况下,你可以写成INSERT INTO table1(field1, field2, field3, field4) SELECT val1, val2, val3, val4 from otherTable...
  • 糟糕,是的,我的意思是插入。我认为他希望列“字段名”填充所有四列的内容,这就是您需要四个插入语句的原因。
  • 您好我编辑了一点问题..您不能使用别名在 2 个不同的表中插入问题中的表中的选择结果?对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-05
  • 2016-11-03
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
相关资源
最近更新 更多