如何选择并插入新表没有重复值?

时间:2011-08-25 08:08:06

标签: mysql

我有两张桌子。两个表具有相同的字段,两个表具有一些数据。现在我想在table1中选择数据并将数据插入table2。但我在两者之间使用,所以我很困惑。请帮帮我...将数据插入到table2中,没有重复值。

INSERT INTO table2 
  (`student_id`, `studentname`, `Regno`, `class`, `date`, `session`
   , `status`, `teacher_id`) 
  SELECT * FROM table1, table2 
  WHERE table1.date <> table2.date
    BETWEEN '2011-01-01'
    AND '2011-05-19' AND table1.class = 'AAA'

1 个答案:

答案 0 :(得分:2)

你正在对不等式进行交叉连接,这将产生大量(重复)行 相反,您应该在LEFT JOIN上进行相等并过滤掉null行。

我将其重写为:

INSERT INTO table2 
  (`student_id`, `studentname`, `Regno`, `class`, `date`, `session`
   , `status`, `teacher_id`) 
SELECT t1.* FROM table1 t1
LEFT JOIN table2 t2 ON (t1.student_id = t2.student_id)
WHERE t1.`date` BETWEEN '2011-01-01' AND '2011-05-19' 
AND t1.`class` = 'AAA'
AND t2.student_id IS NULL 

此处student_id是t1和t2的主键。如果PK是(student_id + teacher_id),则查询变为:

INSERT INTO table2 
  (`student_id`, `studentname`, `Regno`, `class`, `date`, `session`
   , `status`, `teacher_id`) 
SELECT t1.* FROM table1 t1
LEFT JOIN table2 t2 ON (t1.student_id = t2.student_id 
                        AND t1.teacher_id = t2.teacher_id)
WHERE t1.`date` BETWEEN '2011-01-01' AND '2011-05-19' 
AND t1.`class` = 'AAA'
AND t2.student_id IS NULL  /*<<-- this stays the same provided student_id is  
                             <<-- defined as `NOT NULL` */

以下是它的工作原理。
首先,我们选择(t1.student_id = t2.student_id)的所有行;这排列了t1和t2中所有匹配的行 因为它是一个左连接,所以t1列中的行(但不是t2中的行)将在t2列中具有null个值。
通过仅允许t2.student_id IS NULL行,我们只选择t1中t2中没有匹配行的行。