2016-02-09 42 views
0

我最近向我的Invoice表添加了一個新的外鍵約束(ProjectID),並且我試圖更新Invoice表,以便外鍵與給定的記錄集。使用匹配記錄更新表的新添加的列SQL Server

使用以下查詢,我可以找到匹配的記錄。

SELECT 
    IV.InvoiceID, TA.ProjectID 
FROM 
    Invoices IV 
JOIN 
    TimeEntries TE on TE.InvoiceId = IV.InvoiceID 
JOIN 
    Tasks TA ON TE.TaskID = TA.TaskID 

我想正確的方法是使用遊標,並通過在Tasks表中的所有記錄重複,但我不知道如何着手。

這是我到目前爲止有:提前

DECLARE @ForeignKey int 

DECLARE C CURSOR FOR SELECT IV.InvoiceID, TA.ProjectID FROM Invoices IV 
JOIN TimeEntries TE on TE.InvoiceId = IV.InvoiceID 
JOIN Tasks TA ON TE.TaskID = TA.TaskID 

OPEN C 

FETCH NEXT FROM C INTO @ForeignKey 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    UPDATE Invoices 
    SET ProjectID = @ForeignKey 
    WHERE InvoiceID = ??? (Need matching ID) 

謝謝!

+1

你應該從不認爲,「遊標是可能做到這一點的最好辦法。」 SQL Server的構建是爲了處理數據集,而不是遍歷數據。遊標是對程序員不斷要求的讓步,針對由於SQL實現方面的進步而不再是問題的某些問題的解決方案,以及處理**非常罕見的情況,其中基於集合的方法是不可能的。 –

回答

3

你並不需要爲這個光標:

UPDATE IV 
    SET ProjectId = TA.ProjectID 
    FROM Invoices IV JOIN 
     TimeEntries TE 
     ON TE.InvoiceId = IV.InvoiceID JOIN 
     Tasks TA ON TE.TaskID = TA.TaskID; 
+0

謝謝,那就是訣竅! :) – Mortenkp25