2014-11-05 104 views
0

我想使用INSERT INTO從表中複製一些行的SQL查詢,但我想要一個字段(這不是主鍵)有一個新的,獨特的,int(我知道這是可怕的數據庫設計,但我不能改變數據庫的結構)。插入一個唯一的int到非主鍵字段

這裏是什麼,我試圖做一個簡單的例子:

INSERT INTO Mytable 
     (field1 
     ,field2 
     ,field3 
     ,nonKeyUniqueInt) 

    SELECT 
     (field1 
     ,field2 
     ,field3 
     ,(SELECT MAX(nonKeyUniqueInt)+1 FROM mytable) 
    FROM 
     mytable 
    WHERE 
     (conditions) 

然而,這並不工作,因爲SELECT MAX查詢只運行一次,給我的所有新行了,同樣的價值領域。鑑於以下行來複制:

 
field1field2field3nonKeyUniqueInt 
x  y  z  1 
a  b  c  2 

我得到的輸出:

 
field1field2field3nonKeyUniqueInt 
x  y  z  1 
a  b  c  2 
x  y  z  3 
a  b  c  3 

正是我試圖做可能嗎?

+1

注意:'SELECT MAX(...)+ n'通常不會很好地表現出併發性。怎麼樣像['SEQUENCE'](http://msdn.microsoft.com/en-us/library/ff878091.aspx)?或者你不想維護一個全局對象? – 2014-11-05 13:23:51

+0

@ Clockwork-Muse你可能是對的,但它基本上是一次性的查詢,我想以最簡單的方式來完成。 – Slappywag 2014-11-05 14:14:10

回答

2

問題是該子查詢獲得一次評估insert一次,而不是每行一次。該解決方案是使用row_number()

INSERT INTO Mytable(field1, field2, field3, nonKeyUniqueInt) 
    SELECT field1, field2, field3, 
      x.maxk + row_number() over (order by (select NULL)) 
    FROM mytable CROSS JOIN 
     (SELECT MAX(nonKeyUniqueInt) as maxk FROM mytable) x 
    WHERE (conditions); 

我感動的最大計算到FROM條款作出明確表示,它是隻計算一次。

+0

我認爲你的SELECT中的x應該是x.maxk – 2014-11-05 13:12:50

+0

@AndyNichols。 。 。謝謝。 – 2014-11-05 13:13:55

+0

謝謝,它在我的例子中完美。但是,當我試圖將它放入真正的數據庫時,出現錯誤「Subquery返回了超過1個值」。我看不出它是如何做到的!哦,我相信我會解決它的。 – Slappywag 2014-11-05 14:10:19