2

我在 Access 数据库中有两个表。表 1 的列比表 2 多。我想将这些表合并为一个,同时删除重复项。我有以下查询

SELECT FirstName, LastName, PhoneNumber FROM Table1
UNION
SELECT FirstName, LastName, Null as PhoneNumber  FROM Table2

问题是,我不想从 Table2 中复制任何在 Table1 中具有相同 FirstName 和 LastName 的条目。如何更改上述查询以完成此操作?提前致谢。

4

3 回答 3

5

从一个查询开始,它只返回那些Table2不匹配的行Table1

SELECT t2.FirstName, t2.LastName
FROM
    Table2 AS t2
    LEFT JOIN Table1 AS t1
    ON 
            t2.FirstName = t1.FirstName
        AND t2.LastName = t1.LastName
WHERE t1.FirstName Is Null;

然后SELECT在您的UNION查询中使用它。

SELECT FirstName, LastName, PhoneNumber FROM Table1
UNION ALL
SELECT t2.FirstName, t2.LastName, t2.Null AS PhoneNumber
FROM
    Table2 AS t2
    LEFT JOIN Table1 AS t1
    ON 
            t2.FirstName = t1.FirstName
        AND t2.LastName = t1.LastName
WHERE t1.FirstName Is Null;

注意我使用UNION ALL它是因为它需要 db 引擎的工作更少,因此速度更快。仅UNION在您希望数据库引擎清除重复行时使用。但是,在这种情况下,这不是必需的......除非重复项分别存在于一个或两个表中。

于 2013-10-04T03:39:39.737 回答
2

尝试如下约束:

SELECT FirstName, LastName, PhoneNumber FROM Table1
UNION
SELECT FirstName, LastName, Null as PhoneNumber FROM Table2 
WHERE FirstName NOT IN (SELECT FirstName FROM Table1) 
AND LastName NOT IN (SELECT LastName FROM TABLE1);
于 2013-10-04T03:20:25.200 回答
0

FaddishWorm 有一个很好的概念,但是两个单独的子查询会消除任何匹配名字或匹配姓氏的记录。NOT x AND NOT y = NOT(x OR y)。因此,像 Hernandez 和 Jim 这样的名字将从 TABLE2 中省略。

尝试连接。

SELECT FirstName, LastName, PhoneNumber FROM Table1
UNION
SELECT FirstName, LastName, Null as PhoneNumber FROM Table2 
WHERE FirstName & Lastname NOT IN (SELECT FirstName & lastname FROM Table1);

还有其他解决方案。这很慢。HandsUp 有正确的想法。

于 2014-12-05T20:19:58.637 回答