2011-11-11 35 views
2

試想下表爲ASQLSERVER運行計數

col1 col2 col3 rank 
1  2 n 5 
1  2 n 6 
2  3 a 3 

雖然在下面插入記錄從表B到表A,排名列衣被合計應不斷遞增,如果相同的記錄插入。

記錄在表B中該怎麼插入一個是

col1 col2 col3 
1  2 n 
2  3 a 

表A所需的輸出上面記錄插入後,

col1 col2 col3 rank 
    1 2 n 5 
    1 2 n 6 
    1 2 n 7 
    2 3 a 3 
    2 3 a 4 

請幫助我如何達致這。謝謝。

回答

2

如果B中的記錄是唯一的,那麼你可以使用這樣的查詢

-------------- 編輯 --------- ----------

如果B可有多個記錄,您可以使用ROW_NUMBER()funcion與分區

insert into TestA 
select b.*, 
(select max([rank]) from TestA where col1 = b.col1 and col2 = b.col2 and col3 = b.col3) 
+ row_number()over (partition by col1, col2, col3 order by col1, col2,col3 asc) as N 
from TestB b 

------------- - END編輯 -------------------

注:我改名錶:種皮和TESTB

insert into TestA 
select b.*, (select max([rank])+1 from TestAwhere col1 = b.col1 and col2 = b.col2 and col3 = b.col3) 
from TestB b 

或用JOIN這樣

insert into testa 
select b.*, mr+1 from TestB b 
join 
(select col1, col2, col3, max([rank]) as mr 
from TestA A 
group by col1, col2, col3) as M 
on 
b.col1 = M.col1 and b.col2 = M.col2 and b.col3 =M.col3 
+0

嗨,感謝您的幫助。第一個代碼不能工作,因爲運行列不在表b中。我嘗試了第二個。這樣做的問題是,如果表B的重複行與第一行相同,那麼它對第二個條目也具有相同的等級。它必須增加。 –

+0

我修改了查詢以與表B中的多個條目一起工作 –

+0

Genius man ... :)很好...修改後的代碼按預期工作.. –

2

我會用一個INSTEAD OFINSERTtrigger這一點。就像這樣:

CREATE TRIGGER rankInsertTrigger 
ON A 
INSTEAD OF INSERT 
AS 
BEGIN 
    INSERT INTO A(col1, col2, col3, rank) 
    SELECT i.col1, i.col2, i.col3, 
      MAX(SELECT a.rank 
       FROM A AS a 
       WHERE a.col1 = i.col1 
       AND a.col2 = i.col2 
       AND a.col3 = i.col3) + 1 
    FROM inserted i 
END 

每次你現在將值插入表A,該觸發運行,並與設置你想要的rank插入替換原來的插入。

例如,當你做INSERT INTO A(col1, col2, col3) VALUES (1, 2, n),究竟是運行在觸發器的INSERT語句(這需要原始值col1col2col3但要覆蓋rank)。

+0

請問您能解釋一下選擇什麼子句中的觸發器即將檢索?這對我來說是很有幫助的。感謝您的幫助。 –

+1

看起來這不會處理併發插入。 –

+0

@Robin在INSERT觸發器中,有一個名爲'inserted'的表,表示插入的記錄。 select語句從'inserted'表中選擇數據並確定下一個'rank'並使用這些數據插入表A中。 –