我有两张桌子。两个表具有相同的字段,两个表具有一些数据。现在我想在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'
答案 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中没有匹配行的行。