首页 文章

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

提问于
浏览
2

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

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

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

3 回答

  • 0

    从查询开始,该查询仅返回 Table1 中未匹配的 Table2 行 .

    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;
    

    然后在 UNION 查询中使用 SELECT .

    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 . 但是,在这种情况下,这是不必要的......除非在这些表中的一个或两个中单独存在重复项 .

  • 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);
    
  • 5

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

相关问题