簡體   English   中英

插入table1從table2,table3中選擇,其中

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM