2013-06-28 26 views
3

我試圖將tableA中的行復制到空白tableB
將tableA複製到tableB如果A中的列不重複

tableA有一列mytext並且行具有該列中的重複項。

問題 如何從一個複製到B那裏有來自mytext沒有重複的行?換句話說,如果在mytext中有兩個或更多行具有相同的值,請保留具有最小ID號的一個並複製到tableB

最初我試圖刪除重複,但一直得到一個錯誤Error Code: 1205. Lock wait timeout exceeded from this sql command:

DELETE n1 
FROM tableA n1, tableA n2 
WHERE n1.id > n2.id 
AND n1.mytext = n2.mytext 

我對amazonsRDS

+---+-----+-----+------+-------+ 
|id |fname|lname|mytext|morevar| 
|---|-----|-----|------|-------| 
| |  |  |  |  | 
| |  |  |  |  | 
| |  |  |  |  | 
| |  |  |  |  | 
+------------------------------+ 
CREATE TABLE `tableB` (
    `id` int(11) NOT NULL, 
    `fname` varchar(45) DEFAULT NULL, 
    `lname` varchar(45) DEFAULT NULL, 
    `mytext` mediumtext, 
    `morevar` bigint(20) DEFAULT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1$$ 

這個沒有工作,也沒有抓到重複和簡單將tableA中的所有值複製到tableB中

INSERT INTO tableB (`id`,`fname`,`lname`,`mytext`,`morevar`) 
SELECT DISTINCT tableA.id,tableA.fname,tableA.lname,tableA.mytext,tableA.morevar 
FROM tableA 
+0

你是什麼意思「這沒有用」? 「INSERT」聲明的結果是什麼?此外,目前還不清楚你想如何處理重複。如果兩行在'mytext'字段中具有相同的條目,那麼您想要將哪一行插入'tableB'中? – Keith

+0

更新了問題 –

+0

是否選擇語句工作,如果你沒有插入運行它? –

回答

4

試試這個

INSERT INTO tableB (`id`,`fname`,`lname`,`mytext`,`morevar`) 
SELECT id, fname, lname, mytext, morevar 
FROM tableA a 
WHERE id = (Select Min(id) FROM tableA 
      WHERE myText = a.mytext) 

,如果你需要這樣做分批...(編輯標準會將myText控制批次)

INSERT INTO tableB (`id`,`fname`,`lname`,`mytext`,`morevar`) 
SELECT id, fname, lname, mytext, morevar 
FROM tableA a 
WHERE mytext < 'j' 
    And id = (Select Min(id) FROM tableA 
      WHERE myText = a.mytext) 

INSERT INTO tableB (`id`,`fname`,`lname`,`mytext`,`morevar`) 
SELECT id, fname, lname, mytext, morevar 
FROM tableA a 
WHERE mytext >= 'j' 
    And mytext < 'r' 
    And id = (Select Min(id) FROM tableA 
      WHERE myText = a.mytext) 

INSERT INTO tableB (`id`,`fname`,`lname`,`mytext`,`morevar`) 
SELECT id, fname, lname, mytext, morevar 
FROM tableA a 
WHERE mytext >= 'r' 
    And id = (Select Min(id) FROM tableA 
      WHERE myText = a.mytext) 
+0

您認爲這樣可以安全地運行在幾百萬行的東西上嗎?或者我應該添加一個'WHERE'並限制ID號碼? –

+0

表太大,不斷收到'錯誤代碼:2013.在查詢過程中丟失與MySQL服務器的連接' –

+0

然後插入批量的myText值,請參閱編輯答案 –

2

您可以使用GROUP BY mytext到組重複的行一起。以下應該工作:

INSERT INTO tableB 
SELECT * FROM tableA 
    WHERE id IN (SELECT MIN(id) FROM tableA GROUP BY mytext) 
相關問題