我试图查找一个表(表 A)中不存在于另一个表(表 B)中的行,然后将这些行插入到另一个表(表 B)中。但是,两个表中都有多个重复行,我想将新的附加重复项计为要插入的新行。
当前的结构类似于这样:
表A:
+--------+-------+---------+
| prefix | fname | lname |
+--------+-------+---------+
| Mr | John | Smith |
| Mrs | Jane | Doe |
| Mr | John | Smith |
| Mrs | Jane | Doe |
| Mr | Bob | Jones |
| Mrs | Jane | Doe |
| Mr | John | Smith |
| Mrs | Sally | Johnson |
| Mr | Bob | Jones |
| Mrs | Alice | Apples |
+--------+-------+---------+
B表:(id自增)
+----+--------+-------+---------+
| id | prefix | fname | lname |
+----+--------+-------+---------+
| 1 | Mr | John | Smith |
| 2 | Mr | John | Smith |
| 3 | Mrs | Jane | Doe |
| 4 | Mr | Bob | Jones |
| 5 | Mrs | Sally | Johnson |
| 6 | Mrs | Sally | Johnson |
+----+--------+-------+---------+
新添加的集合(表 A 中不在表 B 中的行)如下:
+--------+-------+--------+
| prefix | fname | lname |
+--------+-------+--------+
| Mrs | Jane | Doe |
| Mrs | Jane | Doe |
| Mr | John | Smith |
| Mrs | Alice | Apples |
+--------+-------+--------+
注意:现在“Mrs Sally Johnson”的条目较少,但我只关心相同行数增加的时间,而不是减少的时间。
将这些插入表 B 后,允许 id 自动递增,表 B 将如下所示:
+----+--------+-------+---------+
| id | prefix | fname | lname |
+----+--------+-------+---------+
| 1 | Mr | John | Smith |
| 2 | Mr | John | Smith |
| 3 | Mrs | Jane | Doe |
| 4 | Mr | Bob | Jones |
| 5 | Mrs | Sally | Johnson |
| 6 | Mrs | Sally | Johnson |
| 7 | Mrs | Jane | Doe |
| 8 | Mrs | Jane | Doe |
| 9 | Mr | John | Smith |
| 10 | Mrs | Alice | Apples |
+----+--------+-------+---------+
我研究了不同的连接、并集和相交。但是,我担心这些解决方案不会考虑重复行的数量。 IE,对于这个例子,我希望他们只添加“爱丽丝夫人苹果”。
你可以尝试这样的事情:
INSERT INTO TableB
SELECT Distinct prefix,fname,lname
FROM TableA
SELECT DISTINCT 语句用于仅返回不同(不同)的值。
感谢@JohnFx 的回答
您可以使用左连接获取缺失的行,并使用 is null 检查不匹配的行
select a.prefix, a.fname, a.lname
from tableA a
left join tableB b on a.prefix = b.prefix
AND a.fname = b.fname
AND a.lname = b.lname
WHERE b.finame is null
您可以使用插入选择插入缺失的行
insert into tableB (prefix, fname, lname)
select a.prefix, a.fname, a.lname
from tableA a
left join tableB b on a.prefix = b.prefix
AND a.fname = b.fname
AND a.lname = b.lname
WHERE b.finame is null
INSERT INTO
t2
SELECT
prefix,
fname,
lname
FROM
t1
WHERE
prefix || fname || lname NOT IN (
SELECT
prefix || fname || lname
FROM
t2
);
如果您有大量记录需要处理,我建议在
prefix || fname || lname
上对两个表建立索引。