MySQL合并两个具有相似数据联盟/加入的表?

时间:2018-05-06 20:23:12

标签: mysql join merge union

因此,我有两个表填充了大部分非常相似的数据,例如,每个表中的一行可能具有相同的名字,姓氏和地址,但具有不同的电话号码或电子邮件地址关于最近可用的数据,这些数据是在一个单独的Excel工作表中更新的(我的工作就是将这些数据合并到我们最新的数据库中,他们计划从这里开始使用,而不是excel表)。我只需要一个很好的方法将这些表与相同的列名合并,而无需手动(约24,000+)记录。

以下是两个表的Create Table Syntax:

CREATE TABLE `UsersUpdated` (
`FULLNME` longtext,
`LSTNME` varchar(23) CHARACTER SET utf8 DEFAULT NULL,
`FSTNME` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`MID` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`SUFF` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`STAT` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
`PTY` varchar(3) CHARACTER SET utf8 DEFAULT NULL,
`PH` bigint(20) DEFAULT NULL,
`ALTPH` bigint(20) DEFAULT NULL,
`DOB` datetime DEFAULT NULL,
`REGDTE` datetime DEFAULT NULL,
`ADDR` text,
`ST` int(11) DEFAULT NULL,
`STNME` varchar(19) CHARACTER SET utf8 DEFAULT NULL,
`APT` varchar(7) CHARACTER SET utf8 DEFAULT NULL,
`TWN` varchar(6) CHARACTER SET utf8 DEFAULT NULL,
`ZIP` int(11) DEFAULT NULL,
`W` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
`G17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SIGN` tinyint(1) NOT NULL DEFAULT '0',
`SUPP` tinyint(1) NOT NULL DEFAULT '0',
`NOTES` longtext,
`LTR` tinyint(1) DEFAULT NULL,
`REGISTERED` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

CREATE TABLE `Users` (
`FULLNME` longtext,
`LSTNME` varchar(23) CHARACTER SET utf8 DEFAULT NULL,
`FSTNME` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`MID` varchar(255) CHARACTER SET utf8 DEFAULT NULL,
`SUFF` varchar(50) CHARACTER SET utf8 DEFAULT NULL,
`STAT` varchar(2) CHARACTER SET utf8 DEFAULT NULL,
`PTY` varchar(3) CHARACTER SET utf8 DEFAULT NULL,
`PH` bigint(20) DEFAULT NULL,
`ALTPH` bigint(20) DEFAULT NULL,
`DOB` datetime DEFAULT NULL,
`REGDTE` datetime DEFAULT NULL,
`ADDR` text,
`ST` int(11) DEFAULT NULL,
`STNME` varchar(19) CHARACTER SET utf8 DEFAULT NULL,
`APT` varchar(7) CHARACTER SET utf8 DEFAULT NULL,
`TWN` varchar(6) CHARACTER SET utf8 DEFAULT NULL,
`ZIP` int(11) DEFAULT NULL,
`W` int(11) DEFAULT NULL,
`d` int(11) DEFAULT NULL,
`G17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P17` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P16` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P15` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`G14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`P14` varchar(1) CHARACTER SET utf8 DEFAULT NULL,
`SIGN` tinyint(1) NOT NULL DEFAULT '0',
`SUPP` tinyint(1) NOT NULL DEFAULT '0',
`NOTES` longtext,
`LTR` tinyint(1) DEFAULT NULL,
`REGISTERED` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

如您所见,它们基本上是完全相同的表格,我只需要正确合并它们。

2 个答案:

答案 0 :(得分:0)

也许这很有用。

update Users
set ADDR = (
    select ADDR from UsersUpdated uu
    where uu.FULLNME = Users.FULLNME and uu.DOB = Users.DOB
),  STNME = (
    select STNME from UsersUpdated uu
    where uu.FULLNME = Users.FULLNME and uu.DOB = Users.DOB
) ...
;

您可以将所有列添加到单个更新中。根据数据库的大小,可能很容易单独完成它们。

许多平台允许使用from update子句允许加入和更短的查询,但这可能有问题。这样,如果任何子查询不返回单个值,您将收到错误。

答案 1 :(得分:0)

我会修改Users表,在应该相同的字段上添加一个UNIQUE键(可能是你的描述中的FSTNME,LSTNME和ADDR,但也许你可能会使用其他一些列,例如@建议的DOB) shawnt00),然后INSERT使用UsersUpdated子句将Users中的数据复制到ON DUPLICATE KEY UPDATE,将更新的数据复制到用户已存在于该表中的Users。当UsersUpdated中的用户尚未加入Users时,此查询也会有效。所以,

ALTER TABLE Users ADD UNIQUE KEY NameAddr (FSTNME, LSTNME, ADDR);
INSERT INTO Users
   SELECT * FROM UsersUpdated
   ON DUPLICATE KEY UPDATE
      FULLNME=VALUES(FULLNME),
      LSTNME=VALUES(LSTNME),
      FSTNME=VALUKES(FSTNME),
      ...
      LTR=VALUES(LTR),
      REGISTERED=VALUES(REGISTERED);