2012-10-27 49 views
0

我有一個主表(T1)加入新表與舊,更新不匹配的IDS

id   value  group 
------------------------------ 
5   22  1 
6   55  1 
7   18  2 
8   11  2 

和高速緩存表(T2)

id   value  group 
------------------------------ 
1   12  1 
2   30  1 
3   18  2 
4   11  2 

主要表自動遞增,因此每次保存數據時,表格將被清除並創建新的ID,每次都會上傳。

我需要用t1.id更新t2.id,以便它們匹配。

用於高速緩存表(T2)所需的結果:

id   value  group 
------------------------------ 
5   12  1 
6   30  1 
7   18  2 
8   11  2 

Attempt1:

UPDATE t1, t2 SET t1.id=t2.id WHERE t1.id < t2.id ORDER BY id ASC 

ATTEMPT2:

UPDATE t1, t2 SET t1.id = t2.id WHERE t1.id IS < MIN(t2.id) ORDER BY t1.id ASC 

Attempt3:

UPDATE t1 
    INNER JOIN (
    SELECT 
     MIN(t1.id) AS ID 
    FROM t1 
    GROUP BY ID) m ON t1.ID = m.ID 
    INNER JOIN t2 ON t1.ID = t2.ID 
+0

是否意味着(*表被清除並且新的ID被創建*)ID也被重置回1 ?.如果** NO **,'cache'表可能如何與'main'表連接? –

+0

如果它是一個* cache *表,爲什麼不將主表的ID寫入它? –

+0

該要求不會達到一個好結果IMO – codingbiz

回答

1

我嘗試,嘗試,讓我知道:

Update cache t2 
    set t2.id = t2.id + 
    (select min(t1.id)-min(t2.id) from main t1, cache t2); 

編輯:

如果你可以做兩個步驟的查詢,其容易得多。

DECLARE diffValue INTEGER; 
SELECT min(t1.id)-min(t2.id) into diffValue from main t1, cache t2; 
UPDATE cache t2 set t2.id = t2.id + diffValue; 
+0

謝謝Yogendra,我對「FROM main t1,cache t2」部分有錯誤。但基於你的嘗試,這幾乎工作!但重複第一行的值 - '更新緩存t2,主t設置t2.id = t2.id + (選擇min(t1.id)-min(t2.id))'給我5,5, 5,5在t2.id列而不是5,6,7,8 –

+0

@miles_holt:你提到你在查詢中做了一些調整。最後的查詢是什麼導致了「5,5,5,5」? –

+0

請參閱上面的評論,我刪除了「從主t1,緩存t2」,並將其放在「更新緩存t2,主t1」 –

0

您不能在更新語法中使用連接。

首先刪除所有表中的記錄:

DELETE * FROM t2; 

然後寫在它的新的數據:

INSERT INTO t2 
(t2.id, t2.value, t2.group) 
SELECT t1.id, t1.value, t1.group FROM t1 

這是u想什麼?

+0

感謝n00b,這個問題是我想保留緩存中的值,而不是清除整個表。這樣我可以根據id比較main和cache之間的值。所以我打算只用min(t2.id)加入min(t1.id),其中t1.group = t2.group並在t2中更新所有行。 –

+0

總是隻有4個條目? – n00b

+0

沒有這樣的例子,有很多組和內容將由用戶定義 –