2015-12-10 102 views
1

我創建了一個我在(足球)中踢球的聯賽的運動數據庫,並且遇到問題。當我最初設置存儲的麻袋時,我把它們放在錯誤的團隊中。現在,我試圖編寫一個查詢來交換麻袋和麻袋的價值,因爲除了麻袋數據之外,每行還有更多的數據。SQL Server - 來自2行的貿易值

編輯:我應該注意到,我有一個非常大量的遊戲,這是這種情況。所以手動更新可能不會削減它。

+------------+------------+----------+-------+----------+ 
| fk_eventID | teamName | homeAway | sacks | sackyrds | 
+------------+------------+----------+-------+----------+ 
| 123  | London | 0  | 3 | 9  | 
| 123  | St Thomas | 1  | 2 | 5  | 
+------------+------------+----------+-------+----------+ 

有什麼我可以運行它看起來像下面?基本上,我需要將Row1中的麻袋和麻袋與Row2中的值交換。

+------------+------------+----------+-------+----------+  
| fk_eventID | teamName | homeAway | sacks | sackyrds | 
+------------+------------+----------+-------+----------+ 
| 123  | London | 0  | 2 | 5  | 
| 123  | St Thomas | 1  | 3 | 9  | 
+------------+------------+----------+-------+----------+ 

回答

1

除非你有大量的實例,這是一個問題,你最好的選擇就是幾個直接更新。

Update StatsTable 
SET sacks = 2, sackyrds = 5 
Where fk_eventID = 123 and teamName = 'St Thomas' 

Update StatsTable 
SET sacks = 3, sackyrds = 9 
Where fk_eventID = 123 and teamName = 'London' 
+0

對不起,我應該注意到,我確實有很多實例需要這樣做,所以正常的切換不會像上面那樣工作。 – mike112

0

手動更新可能是最安全的。也就是說,

CREATE TABLE dbo.Teams(
    ID int IDENTITY(1,1) NOT NULL, 
    Team nvarchar(50) NOT NULL, 
    Sacks int NOT NULL, 
    SackYards int NOT NULL 
) 
GO 

SET IDENTITY_INSERT [dbo].[Teams] ON 
GO 
INSERT [dbo].[Teams] ([ID], [Team], [Sacks], [SackYards]) VALUES (1, N'Bears', 5, 5) 
GO 
INSERT [dbo].[Teams] ([ID], [Team], [Sacks], [SackYards]) VALUES (2, N'Chickens', 2, 2) 
GO 
INSERT [dbo].[Teams] ([ID], [Team], [Sacks], [SackYards]) VALUES (3, N'ChickenHawks', 10, 10) 
GO 
SET IDENTITY_INSERT [dbo].[Teams] OFF 
GO 

select * 
from teams ex 
join teams new on 
    (ex.Team = 'Bears' and new.Team = 'Chickens') 
    or 
    (ex.Team = 'Chickens' and new.Team = 'Bears') 

update ex 
    set Sacks = new.Sacks, SackYards = new.SackYards 
from teams ex 
join teams new on 
    (ex.Team = 'Bears' and new.Team = 'Chickens') 
    or 
    (ex.Team = 'Chickens' and new.Team = 'Bears') 

select * 
from teams 
0

一個稍微不同的方法。生成您的更新語句的字符串,然後複製並粘貼那些單獨執行...

-- Update for away teams 
select 'UPDATE [TableName] SET sacks = ' + CAST(T2.sacks as VARCHAR(100)) + ', sackyrds = ' + CAST(T2.sackyrds as VARCHAR(100)) + ' WHERE fk_eventID = ' + CAST(T1.fk_eventID as VARCHAR(100)) + ' AND homeAway = 0' 
from [TableName] T1 
inner join [TableName] T2 on T1.fk_eventID = T2.fk_eventID and T2.homeAway = 1 
where T1.homeAway = 0 

union 

-- Update for home teams 
select 'UPDATE [TableName] SET sacks = ' + CAST(T2.sacks as VARCHAR(100)) + ', sackyrds = ' + CAST(T2.sackyrds as VARCHAR(100)) + ' WHERE fk_eventID = ' + CAST(T1.fk_eventID as VARCHAR(100)) + ' AND homeAway = 1' 
from [TableName] T1 
inner join [TableName] T2 on T1.fk_eventID = T2.fk_eventID and T2.homeAway = 0 
where T1.homeAway = 1 

第一部分選擇所有客場強隊(HomeAway的= 0),並加入到同一個表,也得到了家裏一行那個事件。然後它爲該數據生成一個UPDATE語句。工會然後重複,但主隊加盟。

注意:我還沒有測試過這個腳本,所以很有可能你需要修正一些東西,但是希望你能得到一般的想法。

我也做過這樣的假設:每個fk_eventID只有2行(homeAway = 0或1)。