2013-01-16 83 views
2

我已經看過這裏的幾個主題,但我認爲它們會回答這個問題,但它們似乎並不完全符合我的要求。在SQL中以成對循環的方式循環使用

基本上,我有一個數據庫,其中包括一個用戶表。由於這些用戶非常相同,我們通常會得到重複的結果。換句話說,一個人有兩個獨立的賬戶,並使用他們兩個,直到我們接受併合併成一個賬戶,告訴他們它是哪個賬戶,並停止嘗試使用第二個賬戶。不幸的是,決定哪個賬戶要保留哪個賬戶並且哪個賬戶並不總是遵循公式,而是管理員對情況的瞭解,而且我會逐行通知哪些賬戶會繼續存在和去向。

合併的一部分涉及修改幾個表,通過用我們保留的ID替換丟棄的ID的任何出現。做這份工作的最後一個人有一個腳本來做到這一點,但它只是假設最近的登錄是保留並拉取這些ID對並製作MOD的人。然而,我不能依靠這種情況。我有一個電子表格,裏面有一些ID,我希望能夠通過並處理。到現在爲止,我一直在手動完成這一切,一次一個。

所以,我正在尋找的是值得的效果:

foreach (x,y) in (oldID1, newID1, oldID2, newID2, ...){ 
    go through tables and change all instances of x to y; 
    } 

希望,這是很清晰。

謝謝!

+0

什麼數據庫您使用的? – beny23

+0

循環正是你應該*不*在這裏使用。 – RBarryYoung

+0

由於他似乎不知道UNIQUE約束,所以它可能是mysql。 – wildplasser

回答

0

對於這樣簡單的一次性工作,我喜歡用LINQPad來創建一個快速腳本。你可以只使用一個匿名類型的數組,您的ID對,並執行腳本每對(假設SQL服務器):

var idpairs = new [] { 
    new { OldId = 5, NewId = 10 }, 
    new { OldId = 23, NewId = 45 }, 
    new { OldId = 443, NewId = 299 } 
}; 

using (var con = new SqlConnection(connectionString)) { 
    foreach (var idpair in idpairs) { 
     var oldId = idpair.OldId; 
     var newId = idpair.NewId; 

     // prepare script with old/new id's inserted 
     var sql = string.Format("blah blah blah {0} blah blah {1} blah", 
      oldId, newId); 

     // execute the command 
     var cmd = con.CreateCommand(); 
     cmd.CommandText = sql; 
     cmd.ExecuteNonQuery(); 
    } 
} 
+0

我實際上是直接在數據庫上工作,所以其中一些是多餘的,但是你給了我一個好主意!謝謝! –

0

我要做出一些假設,因爲信息不完全提供。一種假設是電子表格被分成上述字段(oldID,newID) 將電子表格導入到SQL表中。

然後,使用下面的代碼(先爲MS SQL):

DECLARE @oldID int, @newID int 
DECLARE CURSOR idCursor STATIC FOR 
SELECT oldID,newID FROM idSpreadsheetTable 
OPEN idCursor 
FETCH NEXT FROM idCursor INTO @oldID,@newID 
WHILE (@@FETCH_STATUS = 0) 
BEGIN 
    UPDATE Table1 SET idField = @newID WHERE idField = @oldID 
    ... More update table commands 
    FETCH NEXT FROM idCursor INTO @oldID,@newID 
END 
CLOSE idCursor 
DEALLOCATE idCursor 

這裏是MySQL的語法:

DECLARE done INT DEFAULT FALSE; 
DECLARE oldID,newID int; 
DECLARE idCursor CURSOR FOR SELECT oldID,newID FROM idSpreadsheetTable 
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 
OPEN idCursor; 
read_loop: LOOP 
    FETCH idCursor INTO oldID, newID; 
    IF done THEN 
    LEAVE read_loop; 
    END IF; 
    UPDATE Table1 SET idField = newID WHERE idField = oldID; 
    ... More update table commands 
END LOOP; 
CLOSE idCursor; 
+0

再次,我的道歉。我知道我正在留下一些東西。這是一個Oracle數據庫。我正在直接在數據庫上工作。 是的,數據在電子表格中。 –

+0

另外,我喜歡把它全部導入到表格中的想法。不知道爲什麼我沒有想到這一點。但是,一旦我這樣做,我可以簡單地執行: for x in(從IDtable中選擇newID,oldID)循環 使用x執行所有更新。newID和x.oldID 結束循環 –