0

テーブルがありt1、一部の行はすべての列で重複しています EXCEPT id。は AUTO_INCREMENT で、1MIL 行あります
t1。はデータのない新しいテーブルであり、AUTO_INCREMENT は必要ありません。これはおそらく新しい列を作成するためです。id

t2id

Q:を作成した後、すべての列の個別の値を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 に答える