2011-08-25 38 views
1

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

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' 
+0

表2是否有主键?你如何定义重复?所有列是相同的还是只是第一个...等等? – Jacob

+0

我期望'student_id'成为PK(或者可能是组合(student_id + teacher_id) – Johan

回答

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中选择行中没有匹配行的行。

+0

谢谢你soo .....我知道了..... :) – Abi

+0

感谢您的帮助... – Abi

相关问题