如何在删除重复项时合并具有不同列号的两个表?

时间:2013-10-04 03:13:17

标签: sql ms-access duplicates union ms-access-2010

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

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

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

3 个答案:

答案 0 :(得分: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引擎工作,所以因此更快。如果希望db引擎清除重复行,请仅使用UNION。但是,在这种情况下,这不是必要的......除非重复项在这些表中的一个或两个中单独存在。

答案 1 :(得分: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);

答案 2 :(得分:0)

FaddishWorm有一个很好的概念,但是两个独立的子查询将消除匹配firstname或匹配lastname的任何记录。 NOT x AND NOT y = NOT(x OR y)。因此,表2中将省略Hernandez和Jim等名称。

尝试连接。

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有正确的想法。