插入2个表选择表SQL Server的结果

时间:2011-02-24 03:33:29

标签: sql sql-server-2008

如何从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

这可能吗?

2 个答案:

答案 0 :(得分:2)

当然,很难理解你想要完成什么。如果您实际上尝试将行插入两个不同的表中,如marc_s所述,则必须使用两个insert语句。

但是,根据您的示例判断,您可能不会尝试插入两个表,而是使用两个表插入第三个表,您可以在其中转置数据。如果是这种情况,那么您可以在一个语句中执行此操作:

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

答案 1 :(得分:0)

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

只需为每列创建一个insert语句,假设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