如何将表A中不存在于表B中的行插入到表B中

问题描述 投票:0回答:3

我试图查找一个表(表 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,对于这个例子,我希望他们只添加“爱丽丝夫人苹果”。

sql sql-server
3个回答
0
投票

你可以尝试这样的事情:

INSERT INTO TableB
SELECT Distinct prefix,fname,lname
FROM TableA 

SELECT DISTINCT 语句用于仅返回不同(不同)的值。

感谢@JohnFx 的回答


0
投票

您可以使用左连接获取缺失的行,并使用 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

0
投票
INSERT INTO
  t2
SELECT
  prefix,
  fname,
  lname
FROM
  t1
WHERE
  prefix || fname || lname NOT IN (
    SELECT
      prefix || fname || lname
    FROM
      t2
  );

如果您有大量记录需要处理,我建议在

prefix || fname || lname
上对两个表建立索引。

© www.soinside.com 2019 - 2024. All rights reserved.