7

我不知道为什么我对这个查询感到困惑。

我有两个表:记录和Table A记录。两个表都需要包含相同的数据,但存在一些不匹配。900Table B800

我需要编写一个 mysql 查询来插入丢失的100记录Table ATable B.

最后,两者Table ATable B应该是相同的。

我不想先截断所有条目,然后再从另一个表中插入。所以请任何帮助表示赞赏。

谢谢你。

4

5 回答 5

20

也可以LEFT OUTER JOIN用于此。这将避免子查询开销(当系统可能对外部查询的每条记录执行一次子查询时),就像在 John Woo 的回答中一样,并且将避免做不必要的工作来覆盖已经存在的 800 条记录,例如 user2340435 的记录:

INSERT INTO b
SELECT a.* FROM a
LEFT OUTER JOIN b ON b.id = a.id
WHERE b.id IS NULL;

这将首先选择所有行AB表,包括两个表中的所有列,但对于存在于表中A和不存在于表的B所有列中的B行将是NULL. 然后它只过滤后面的行(WHERE b.id IS NULL),最后将所有这些行插入到B表中。

于 2015-07-10T18:14:57.697 回答
5

我想你可以用IN这个。(这是您查询的简化

INSERT INTO table2 (id, name)
SELECT id, name
FROM table1
WHERE (id,name) NOT IN 
       (SELECT id, name
        FROM table2);

SQLFiddle 演示

正如您在演示中看到的那样,table2只有 1 条记录,但在执行查询后,在 上插入了 2 条记录table2

于 2012-10-24T16:20:07.993 回答
2

如果它是 mysql 并且表是相同的,那么这应该可以工作:

REPLACE INTO table1 SELECT * FROM table2;
于 2014-09-10T21:20:05.393 回答
0

group by当使用andhaving子句时,代码也可以工作。经过测试的 SQL 2012 (11.0.5058) Tab1 是包含新记录的源,Tab 2 是要更新的目标。选项卡 2 也有一个身份列。(是的,伙计们,现实世界并不像实验室作业那样干净整洁)

INSERT INTO Tab2
SELECT  a.T1,a.T2,a.T3,a.T4,a.Val1,a.Val2,a.Val3,a.Val4,-9,-9,-9,-9,MIN(hits) MinHit,MAX(hits) MaxHit,SUM(count) SumCnt, count(distinct(week)) WkCnt
FROM Tab1 a 
LEFT OUTER JOIN Tab2 b ON b.t1 = a.t1 and b.t2 = a.t2 and b.t3 = a.t3 and b.t4 = a.t4 and b.val1 = a.val1 and b.val2 = a.val2  and b.val3 = a.val3  and b.val4 = a.val4 
WHERE b.t1 IS NULL or b.Val1 is NULL
group by a.T1,a.T2,a.T3,a.T4,a.Val1,a.Val2,a.Val3,a.Val4 having MAX(returns)<4 and COUNT(distinct(week))>2 ;
于 2016-03-14T15:54:01.827 回答
0

这会将丢失的记录插入 Table1

INSERT INTO Table2
(Col1, Col2....)
(
SELECT   Col1, Col2,... FROM Table1
EXCEPT
SELECT  Col1, Col2,... FROM Table2
)

然后,您可以运行更新查询来匹配不同的记录。

UPDATE Table2
SET
Col1= T1.Col1,
Col2= T1.Col2,
FROM
Table T1
INNER JOIN
Table2 T2
ON
T1.Col1 = T2.Col1
于 2017-06-16T17:48:18.950 回答