2017-06-19 88 views
-1

插入到相同的表,我有:如何從表複製下表記錄和使用存儲過程的SQL Server

enter image description here

我只想複製那些從0版本記錄及其student_id數據是永遠在版本1中重複,這意味着不變的記錄。我想將所有複製的記錄插入到版本爲1的同一張表。什麼是存儲過程。

+1

問:「什麼會被存儲過程本」。答:「存儲過程將是可能的解決方案之一。」但非常嚴肅的是,你必須告訴我們你曾經嘗試過什麼,不要指望得到任何答案。 –

回答

0

您可以通過執行選擇記錄:

select t.* 
from t 
where t.version = 0 and 
     not exists (select 1 
        from t t2 
        where t2.student_id = t.student_id and t2.version = 1 
       ); 

剩下的只是一個insert

0

使用group byhaving max(version) = 0

insert into student_name (student_id, student_name, version) 
select student_id, max(student_name), 1 
from student_name 
group by student_id 
having max(version) = 0 

被存儲的過程中,採取了version一個參數,即插入了學生沒有該版本記錄誰記錄:輸出行是插入:

create procedure dbo.insert_new_version (@version int) as 
begin; 
    set nocount, xact_abort on; 

    insert into student_name (student_id, student_name, version) 
    output inserted.* 
    select 
     student_id 
    , student_name = max(student_name) 
    , version = @version 
    from student_name 
    group by student_id 
    having max(version) < @version 
end; 

rextester演示:http://rextester.com/JSTNI40605

回報:

+-----------+------------+--------------+---------+ 
| record_id | student_id | student_name | version | 
+-----------+------------+--------------+---------+ 
|  11 |   3 | ccc   |  1 | 
+-----------+------------+--------------+---------+ 
0

您可以選擇和插入這樣

Insert INTO tableName select t1.student_Id, t1.student_name,1 from tablename t1 
where t1.version = 0 and not exists 
(select 1 from tablename t2 where t2.student_id = t.student_id and t2.version = 1); 
+0

雖然這段代碼可能會回答這個問題,但應該總是解釋它的作用以及它如何解決問題。 – BDL

0

您可以通過LEFT試試這個加入:

INSERT INTO TBL SELECT T1.record_id,T1.student_Id ,T1.student_name,1 FROM tbl T1 LEFT JOIN tbl T2 ON T1.student_Id = T2.student_Id AND T2.version = 1 WHERE T1.version = 0 AND T2.record_id IS NULL

0

我建議使用while循環遍歷表並確定需要複製的項目,然後對這些值進行 評估,如果它們符合重新插入的標準並且然後插入它們。

您的代碼應該如下所示。添加CREATE PROC部分,編輯表名適用 (警告:我寫了這對記事本,所以如果你得到了一些錯誤,只是嘗試解決這些問題)

DECLARE @counter int = 0, @row_Count int = 0, @currentId int, 
@currentName nvarchar(100), @version int, @current_Student_id int 

SET @row_Count = (SELECT COUNT(record_Id) from yourTable) 

WHILE @counter <= @row_Count 
BEGIN 
SET @currentId = (SELECT record_Id FROM (SELECT row_number() over (order by id) 
      AS RowNum, record_Id FROM yourTable) sub WHERE [email protected]) 

SET @currentName = (SELECT student_name FROM yourTable WHERE record_Id = @currentId) 
SET @current_Student_id = (SELECT student_id FROM yourTable WHERE record_Id = @currentId) 
SET @version = (SELECT version FROM yourTable WHERE record_Id = @currentId) 

--USE IF to check if the current version is 0 and the student ID has not been inserted already 

IF (SELECT COUNT(record_Id) FROM yourTable WHERE student_id = @current_Student_id AND version = 1) < 1 
      AND @version = 0 
BEGIN 
INSERT INTO yourTable (student_id, student_name, version) 
    VALUES 
(
@current_Student_id, 
@currentName, 
1 
) 
END 

SET @counter = @counter + 1; 
END 
相關問題