0

我有一个表t1,有些行在所有列中都有重复,除了id
t1idAUTO_INCREMENT 并且有 1MIL 行。

t2是一个没有数据的新表,id不需要 AUTO_INCREMENT,因为我可能会为此创建一个新列。

问:我创建后t2,如何从所有列中的不同值复制t1到其中,这样就没有重复的行t2t1t2

我在亚马逊RDS ENGINE=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 
4

3 回答 3

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 ;
于 2013-07-11T01:02:55.257 回答
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

如果重复项之间的其他列不同,它将任意从中选择值(不一定来自相同的行,甚至)。

于 2013-07-11T01:01:54.583 回答
1

试试这个代码,它会选择最小的 id 重复数并考虑所有列。

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;
于 2013-07-11T01:08:19.860 回答