【问题标题】:MySQL Merge Two Tables with Similar Data Union/Join?MySQL合并两个具有相似数据联合/连接的表?
【发布时间】:2018-10-16 16:03:17
【问题描述】:

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

这是两个表的创建表语法:

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;

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

【问题讨论】:

  • 好吧,如果你不能确定哪些值会匹配,那将是不可靠的。你真的应该准确地定义你希望这个合并操作如何工作。
  • @shawnt00 我意识到这一点,但无论如何我可以只使用主表作为默认值,并用更新表中的任何内容覆盖其所有内容吗?老实说,这才是最重要的。我必须运行多个更新语句吗?
  • 在两个表中唯一标识用户的一列或多列是什么?
  • 我喜欢句子
  • 任何时候你发现自己有枚举列,警钟应该开始响起

标签: mysql join merge union


【解决方案1】:

也许这很有帮助。

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
) ...
;

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

许多平台允许带有updatefrom 子句允许连接和更短的查询,但这可能会出现问题。这样,如果任何子查询不只返回一个值,您就会得到错误。

【讨论】:

  • 所以本质上,我必须在每一列上运行它才能确定?
【解决方案2】:

我会修改Users 表以在应该相同的字段上添加一个唯一键(可能是您的描述中的 FSTNME、LSTNME 和 ADDR,但也许您可能会使用其他一些列,例如 @shawnt00 建议的 DOB) ,然后将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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 2021-07-15
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    相关资源
    最近更新 更多