2016-09-30 107 views
-1

多個記錄,我一直都在一天尋找,但找不到答案是:SQL - 插入從選擇

我有SQL Server上的表:

dbo.Program

與字段:

  • Program.id ... PK自動遞增
  • Program.user ... VARCHAR
  • Program.program ... VARCHAR
  • Program.installed ...布爾
  • Program.department ... VARCHAR
  • Program.wheninstalled ...日期

現在,我想插入一個新的記錄每一個不同的用戶,並從他的最新(Program.wheninstalled)記錄複製該部門與其他值同樣爲每一位用戶:

  • Program.user ... 每一個獨特的用戶
  • Program.program ... MyMostAwesomeProgram
  • Program.installed ......假
  • Program.department ... 部門備案的與所有最新的program.wheninstalled場在program.user
  • Program.wheninstalled獨特的用戶記錄...空

我知道該怎麼做,在一個醜陋的方式:

  1. 在這個紀錄從1
  2. 提取值)選擇爲每一位用戶的最新記錄及其部門並使之成爲INSERT INTO (字段1,字段2 ... fieldX)值 (1records_value1,1records_value2 ... 1records_valueX), (2records_value1,2records_value2 ... 2records_valueX), ... (Nrecords_value1,Nrecords_value2 ... Nrecords_valueX)

,但我想知道如何做一個更好的辦法。哦,我不能使用一些適當的人力資源數據庫來讓我的生活更輕鬆,所以這就是我現在需要的。

回答

1

你說你知道該怎麼做選擇

insert into Program (user, program, installed, department, wheninstalled) 
select user, 'MyMostAwesomeProgram', 'false' , department, null 
from ... 
1

我是一個Postgres的傢伙,但低於一些類似於在應該工作:

insert into Program (user, program, installed, department, wheninstalled) 
select user, 
    'MyMostAwesomeProgram', 
    false, 
    (select department from someTable where u.user = ...), 
    null 
from users as u; 

https://stackoverflow.com/a/23905173/3430807

1

這應該這樣做:

insert into Program (user, program, installed, department, whenInstalled) 
select user, program, installed, department, whenInstalled 
from 
(
    select User 
    , 'MyMostAwesomeProgram' program 
    , 0 installed 
    , department 
    , null whenInstalled 
    , row_number() over (partition by user order by whenInstalled desc, id desc) r 
from Program 
) p 
where p.r = 1 

有趣的是row_number() over (partition by user order by whenInstalled desc, id desc) r

這是說,返回一列,r,持有值1..n的每個user,根據order by子句向上計數(即開始與最近whenInstalled和向後工作)。

我還在order by子句中包含id字段,以防在同一日期有兩次安裝同一用戶;在這種情況下,最近添加的(首先使用更高的id)。

然後我們把它放在一個子查詢中,並且只選擇第一條記錄;因此我們每個用戶有1條記錄,這是最近的記錄。

我們在此記錄中使用的唯一值是userdepartment字段;所有其他都是按照您的默認值定義的。

+0

ps。如果您想閱讀這篇文章,可以在這裏找到關於這個類似功能的好博客。 http://blog.sqlauthority.com/2007/10/09/sql-server-2005-sample-example-of-ranking-functions-row_number-rank-dense_rank-ntile/ – JohnLBevan

+1

非常感謝。你的查詢最終幫助我完成了它。現在我明白了分區vs vs分組,這些簡短的別名,最後我使用了一些排名函數,因爲您的查詢只返回一行。但與排名它完美的作品:]。無論如何,對於那些可能谷歌這一點: –

0

所以我要回答這對於誰可能google一下其他一些人:

  1. 要想從表中的記錄,您需要使用另一臺選擇爲聲明
  2. 我喜歡用隨着 XXX的(部分選擇)來指定,說,「虛擬」的表,你可以查詢
  3. 期間工作作爲JohnLBevan meantioned一個非常有用的功能ROW_NUMBER分區由什麼我錯過了一個排名

所以一旦你對這些閱讀,你應該能夠理解如何做我想做的事。