![](/img/trans.png)
[英]sql server insert data from table1 to table2 where table1=table3 data
[英]insert table1 select from table2,table3 where
我在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。 當子查詢遵循=,!=,<,<=,>,> =或將子查詢用作表達式時,不允許這樣做。
我想我只是不了解insert ... select語法等的局限性。對於獲得此正確性的任何建議將不勝感激。
更新:
如果我只是運行“從...中不存在的……中選擇...”,那么我將得到正確顯示的行數(我知道每種情況下會丟失多少行)。 我已經檢查了這些行,它們似乎具有正確的值,並且沒有重復項。
如果我將選擇放入臨時表中,則可以正常工作,並且可以在該臨時表中獲得所需的內容。 但是我不能這樣做:
insert [ParameterValues] select * from #temptable
因為那給了我同樣的錯誤。 因此,在我的參數值表中的結構或FK中必須有某些東西可以打破這一點。
使用SSMS,我可以將這些行直接復制並粘貼到目標表中,而不會出現任何錯誤,因此這些行中的值看起來很好,並且不會破壞任何FK等。我再次檢查了一下,並且沒有觸發器或SP這個數據庫,FK關系看起來還不錯。
在過去的幾個小時里,我一直在這附近轉過屋,這讓我發瘋了。 在短期內,我擁有需要使用的數據,但是我將不得不在數據庫的其他副本上重復此過程,並且希望通過腳本等以標准可重復的方式進行此操作,而不是手動操作。 ..
您可以這樣做:
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)
UPDATE
坦白地說,您的原始查詢也應該起作用(盡管從我的角度來看,盡管使用表別名進行查詢看起來更優雅,但始終最好明確指定要插入的列名)。 經過一番思考,我找不到您的查詢引發此類異常的原因。
確定要提供遇到的實際查詢嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.