2009-09-09 41 views
0

所以我有一個表,看起來像這樣:SQL查詢 - 複製值在同一個表

 
ProjectID TaskID  Date 
000   001  10/28/09 
000   002  12/1/09 
000   003  02/24/10 
001   001  04/14/10 
001   002  07/5/10 
001   003  02/24/11 
002   001  06/07/10 
002   002  07/7/10 
002   003  09/13/12 

假設有許多項目和許多任務,但每個項目都包含相同的任務。我想按以下方式複製日期:

一個項目(000)具有主日期。我想將每個任務的這些日期複製到其他幾個項目中(示例數據中的001,002)。

因此,如果項目000中的任務001的日期爲10/28/09,我希望其他項目中的任務001(我知道他們的ID)具有相同的日期。

如果項目001中的任務002的日期是12/1/09,我希望任務002在每個其他項目中都有這個日期。

是否有一個查詢可以做到這一點?我認爲應該有,但我現在無法弄清楚。

順便說一句,我使用的SqlServer 2005

回答

0
UPDATE dbo.Projects 
SET Date = (SELECT Date FROM dbo.Projects p1 
      WHERE p1.ProjectID = '000' AND p1.TaskID = dbo.Projects.TaskID) 
WHERE ProjectID IN ('P01', 'P02', 'P03', 'P04') 
AND TaskID IN ('001', '002', '003') 

將是爲你做?

因此,對於的TaskID = 001,該語句將

SELECT Date FROM dbo.Projects WHERE ProjectID = '000' AND TaskID = '001' 

,然後更新每個項目(P01-P04)和的TaskID = 001這個日期。這就是你要找的,不是?

您也可以使用OUTPUT子句來證明給你看的是什麼更新時間:

UPDATE dbo.Projects 
SET Date = (SELECT Date FROM dbo.Projects p1 
      WHERE p1.ProjectID = '000' AND p1.TaskID = dbo.Projects.TaskID) 
OUTPUT inserted.ProjectID, inserted.TaskID, inserted.Date 
WHERE ProjectID IN ('P01', 'P02', 'P03', 'P04') 
AND TaskID IN ('001', '002', '003') 

這將導致每行被更新到輸出的新值(例如,更新後),這樣你可以檢查並看看有什麼更新,以及什麼值。

剛剛運行的查詢,這是結果我得到:

ProjectID TaskID Date 
    0  1 2009-10-28 00:00:00.000 
    0  2 2009-12-01 00:00:00.000 
    0  3 2010-02-24 00:00:00.000 
    1  1 2009-10-28 00:00:00.000 
    1  2 2009-12-01 00:00:00.000 
    1  3 2010-02-24 00:00:00.000 
    2  1 2009-10-28 00:00:00.000 
    2  2 2009-12-01 00:00:00.000 
    2  3 2010-02-24 00:00:00.000 

爲1,2,3已經被設置爲「主」的值項目1和2以及任務的日期項目0 。

+0

乍一看,它似乎並不認爲此查詢的日期與從主到其他每個任務。我讀錯了嗎? –

+0

它爲您正在處理的每個TaskID選擇項目「000」中的「日期」,並將其他項目的「日期」設置爲該選定日期 –

+1

投票支持你的人是吸菸的人,一個很好的解釋。謝謝一堆! –

0

也許是這樣的:

INSERT INTO Projects(ProjectID, TaskID, Date) 
SELECT P2.ProjectId, P1.TaskID, P1.Date 
FROM Projects P1 
CROSS JOIN (SELECT DISTINCT ProjectID FROM Projects WHERE ProjectId <> '000') P2 

我不知道你正在使用的數據庫引擎,以及一些可允許更自然的語法比上面。

以上顯然也假定尚未爲其他項目設置時隙,並且您試圖定義新時隙而不是更新現有時隙。

0

這應該只是罰款:

UPDATE projects SET [date] = (SELECT [date] FROM projects p1 WHERE project = '000' AND p1.task = projects.task) 
0

這是你想要的,只需更換「......」隨着項目的CSV列表。

UPDATE c 
SET c.Date = p.Date 
FROM Projects AS [c] 
JOIN Projects AS [p] 
    ON p.TaskID = c.TaskID 
    AND p.ProjectID = '000' 
WHERE c.ProjectID IN (...) 
0
DECLARE @MasterProjectId varchar(10) 
DECLARE @ChildProjectIds varchar(100) 

Select 
@MasterProjectId = '000', 
@ChildProjectIds = '''123'',''456''' 


EXECUTE sp_executesql N'Update childProjects 
Set childProjects.[Date]= masterProject.[Date] 
from Projects masterProject 
Inner join Projects childProjects on childProjects.TaskId = masterProject.TaskId and childProjects.ProjectId in (' + @ChildProjectIds + ') 
where masterProject.ProjectId = ' + @MasterProjectId 
+0

確實沒有必要創建一個動態SQL語句並執行它 - 看起來過於複雜,IMO –

+0

很好地設置您的代碼格式,您應該突出顯示您的代碼行,然後按工具欄上的「代碼」按鈕(010 101)創造一個不同的世界! –