Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在两个表中插入选择表SQL Server的结果_Sql_Sql Server 2008 - Fatal编程技术网

在两个表中插入选择表SQL Server的结果

在两个表中插入选择表SQL Server的结果,sql,sql-server-2008,Sql,Sql Server 2008,如何将select语句的结果插入到两个表中 我有一个包含多个数据的表: val1 val2 val3 .... valn ------------------------- 12 21 54 78 .. .. .. .. 我有点像: 从tablename中选择t1.val1、t1.val2、t2.val3、t2.val4到table1 t1、table2 t2。 所以我想把val1,val2插入到一个新表中,该表有两个字段,如: tabble1:

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

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

val1 val2 val3 .... valn
-------------------------
 12   21   54        78
 ..   ..    ..       ..
我有点像:
从tablename中选择t1.val1、t1.val2、t2.val3、t2.val4到table1 t1、table2 t2。

所以我想把val1,val2插入到一个新表中,该表有两个字段,如:

tabble1:
id fieldvalue
1   val1
2   val2
val3和val4也是如此。这是怎么做到的

tabble2:
id fieldvalue
1   val3
2   val4

这是可能的吗?

不能有一个insert语句从一列创建两行,并且值来自不同的列

假设id字段是一个自动递增的列,只需为每列创建一条insert语句即可

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

诚然,很难理解你想要完成什么。如marc_所述,如果您实际上试图将行插入到两个不同的表中,则必须使用两个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

这些不是您所称的update语句,而是INSERT语句。在这种情况下,您可以很好地将
插入到表1(field1,field2,field3,field4)中,从其他表中选择val1,val2,val3,val4
…哦,是的,我是指插入。我想他想让“fieldname”一栏填满所有四栏的内容,这就是为什么你需要四条insert语句的原因。。您不能使用alias在两个不同的表中插入从问题中的表中选择的结果?对吗?它不能-不能在单个SQL语句中。
INSERT
总是放在一个表中-如果你需要填写两个表,你需要两条语句。你是想规范化一个现有的表吗?不是真的,只是拆分它们的一些属性excuse me@Thomas,当我有多个列值,比如,val1,val2,val3,val4….valn我知道动态sql可以使用,但是如何使用?您的两个解决方案中,哪一个更容易为动态sql实现?@darkcminor-因为您是在中间层组件中实现的(对吧?),这真是一个推动。第二种解决方案的优点是,它会自动为您创建序列号,前提是您需要序列号。