我在 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
)
因此,对于上下文和参数的每个组合,参数值表中都应该有一行。因此,对于 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 关系看起来还不错。
在过去的几个小时里,我已经绕着房子转了一圈,这让我发疯了。在短期内,我有需要处理的数据,但我将不得不在数据库的其他副本上重复此过程,并且希望通过脚本等以标准的可重复方式执行此操作,而不是手动破解。 ..