2013-07-11 95 views
0

我有一個表t1,除了id之外,某些行在所有列中都有重複項。
t1id是AUTO_INCREMENT並具有1MIL行。

t2是一個沒有數據的新表,並且id不需要AUTO_INCREMENT,因爲我可能會爲此創建一個新列。

從t1複製到新表中t2過濾掉重複行

問:後,我創建t2,如何從t1複製到t2其中不同的值從t1中的所有列,使t2有沒有重複的行

我在亞馬遜RDSENGINE=InnoDB

t1 - 這是我的

+---+-----+-----+------+-------+ 
|id |fname|lname|mytext|morevar| 
|---|-----|-----|------|-------| 
| 1 | joe | min | abc | 123 | 
| 2 | joe | min | abc | 123 | 
| 3 | mar | kam | def | 789 | 
| 4 | kel | smi | ghi | 456 | 
+------------------------------+ 

T2 - 這是我想與

+---+-----+-----+------+-------+ 
|id |fname|lname|mytext|morevar| 
|---|-----|-----|------|-------| 
| 1 | joe | min | abc | 123 | 
| 3 | mar | kam | def | 789 | 
| 4 | kel | smi | ghi | 456 | 
+------------------------------+ 

這是我的企圖最終是什麼,但有:Error Code: 1136. Column count doesn't match value count at row 1

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
SELECT DISTINCT st.mytext 
FROM t1 st 
WHERE st.id>0 
AND st.id<=1000 
+0

您的示例't1'不僅顯示'mytext'中的重複數據,而且還顯示所有其他列(id爲'除外)中的重複數據。如果數據不同,哪些記錄應該保留(哪些丟失)? – eggyal

+0

@eggyal im不知道你在哪裏看到重複? 't2'是我想要結束的,它不包含數據 –

+1

不,但't1'包含一個副本,並且不清楚爲什麼選擇記錄1而不是記錄2.確實,如果其他值在其他值不同列(但在'mytext'中是一樣的),你可能會選擇記錄2而不是記錄1? – eggyal

回答

1

使用GROUP BY使只是列不同。

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
SELECT id, fname, lname, mytext, morevar 
FROM t1 st 
WHERE st.id>0 
AND st.id<=1000 
GROUP BY mytext 

如果另一列中的重複之間不同,它會選擇值從它們任意地(不一定來自同一行,偶數)。

2

最簡單的方法是使用group by

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
    SELECT id,fname,lname,mytext,morevar 
    FROM t1 st 
    WHERE st.id>0 AND st.id<=1000 
    group by mytext; 

但是,從技術上講,這是不正確的,因爲列值不能保證來自於同一行。所以,正確的方法是:

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
    SELECT st.id, st.fname, st.lname, st.mytext, st.morevar 
    FROM t1 st join 
     (select mytext, min(id) as minid 
      from t1 
      group by mytext 
     ) mint 
     on st.id = minid 
    WHERE st.id>0 AND st.id<=1000 ; 
+0

因爲我有1MIL行,你建議我設置'where'子句有多大塊?一次有1千行? 10K行? 100K行? –

+0

@tq。 。 。我通常不批量插入。在這個查詢中的成本將是'mytext'上的聚合,而不是插入部分。 –

+0

它已經超過10分鐘做了一批1000的過程還在繼續?你認爲這有問題嗎?通常需要這麼長時間嗎? –

1

試試這個代碼,它會選擇最小的重複號碼,並考慮所有列。

INSERT INTO t2 (id,fname,lname,mytext,morevar) 
SELECT min(id) id, fname, lname, mytext, morevar 
FROM t1 
WHERE t1.id > 0 and t1.id <= 1000 
GROUP BY fname, lname, mytext, morevar 
ORDER BY id;