insert table1从table2中选择,table3在哪里

时间:2015-03-27 15:14:35

标签: sql sql-server sql-server-2008 insert-select

我在Windows 7上使用SQL Server 2008 R2,我正在尝试填写表中缺少的行。对于背景,我有

  • 一组“参数”,它们都具有(字符串)值。这些参数大约有200个

  • 一组“上下文”,我需要为每个参数都有一个值。这些背景有很多种。

我在数据库中使用三个表对此进行建模:

[Parameter] (
    [ID] int not null,
    [DefaultValue] varchar(100) not null
)

[Context] (
    [ID] int not null
)

[ParameterValues] (
    [ID] int IDENTITY(1,1) not null,
    [ParameterID] int not null,
    [ContextID] int not null,
    [Value] varchar(100) not null
)

因此,对于context和parameter的每个组合,参数值表中应该有一行。因此,对于200个参数和10个上下文,我应该期望在ParameterValues表中有200x10 = 2000行。

由于历史原因,我们在某些上下文中缺少一些参数值,我想填写ParameterValues表中的所有缺失值。

我正在尝试使用以下查询:

insert [ParameterValues]
  select [Parameter].[ID], [Context].[ID], [Parameter].[DefaultValue]
    from [Parameter],[Context]
     where not exists 
      (select 1 from [ParameterValues]
                where [ParameterValues].[ContextID] = [Context].[ID] 
                  and [ParameterValues].[ParameterID] = [Parameter.[ID])

我一直收到以下错误:

  

子查询返回的值超过1。这是不允许的   子查询跟随=,!=,<,< =,>,> =或当子查询用作   表达。

我想我只是不理解插入的限制...选择语法等。非常感谢任何有关正确的建议。

更新:

如果我只是运行“select ... from ... where not exists ...”,那么我会显示正确的行数(我知道每个上下文中缺少多少行)。我检查了那些行,它们似乎有正确的值,没有重复。

如果我选择临时表,它工作正常,我得到该临时表中的预期内容。但我不能这样做:

insert [ParameterValues] select * from #temptable

因为这给了我同样的错误。因此,结构中必定存在某些内容,或者参数值表中的FK必须打破这一点。

使用SSMS,我可以将这些行直接复制并粘贴到目标表中,并且不会出现任何错误,因此这些行中的值看起来很好,并且不会破坏任何FK等。我只是再次检查并且没有触发器或者在这个数据库中的SP,FK关系看起来没问题。

在过去的几个小时里,我已经绕过房子了,这让我疯了。在短期内,我有需要使用的数据,但我必须在数据库的其他副本上重复此过程,并希望通过脚本等以标准可重复的方式执行,而不是手动黑客。 ..

1 个答案:

答案 0 :(得分:1)

你可以这样做:

insert into ParameterValues (ParameterID, ContextID, Value)
select P.ID, C.ID, P.DefaultValue
from Parameter as P, Context as C
where not exists 
      (select top 1 * from ParameterValues as PV
       where PV.ContextID = C.ID and PV.ParameterID = P.ID)

<强>更新

坦率地说,您的原始查询也应该起作用(尽管从我的观点来看,使用表别名的查询看起来更优雅,并且明确指定要插入的列名称总是更好)。经过一些想法后,我找不到你的查询抛出这种异常的原因。

您确定自己提供的实际查询存在问题吗?