如何连接2个表但不重复行?

时间:2014-06-17 14:55:15

标签: mysql

我有2个表,其中包含一些重复数据。是否可以使用JOIN将2个表合并到第3个表中,或者将表2(带有更新的信息)合并到表1(旧数据)中?

我知道这似乎是一个特殊的问题,但原始数据库有新的数据库(#2)不包含的额外列。当我试图合并它们时,我不断用额外的数据来破坏旧的行。

这种情况下的数据库是邮政编码,城市名称等。我正在尝试确定如何插入丢失的邮政编码行。在这种情况下,邮政编码是唯一的。列为zip_codecitylatlon。表1包含time_zone等唯一列。

我试着INSERT NOT IN但正如我所说,我一直搞砸了。有人可以通过我的示例列向我展示正确的方法,而不会再次使用它吗?一旦我看到正确的方法,我可以稍后将其他列添加到语句中。

2 个答案:

答案 0 :(得分:0)

就我而言,不合并到第3个表格更容易。我发现这种方法非常有效。它允许您将表B合并到表A中,其中表A上已经存在匹配的行。在这种情况下,zip_code中的邮政编码。

INSERT INTO testing.table_name
(
zip_code,
city,
lat,
lon) 

SELECT zip-new.zip_code,
    zip-new.city,
    zip-new.lat,
    zip-new.lon,

FROM testing.zip-new

WHERE zip_code not in (
  SELECT zip_code 
  FROM testing.table_name
 )

希望它可以帮助别人。

答案 1 :(得分:-1)

听起来你要做的就是全力以赴。 MySQL并不直接支持完全外部联接,但您可以使用几个LEFT JOIN查询来模拟它们,并将结果合并在一起。

SELECT table_1.*, table_2.*
FROM table_1
LEFT OUTER JOIN table_2
ON table_1.somecolumn = table_2.somecolumn
UNION 
SELECT table_1.*, table_2.*
FROM table_2
LEFT OUTER JOIN table_1
ON table_1.somecolumn = table_2.somecolumn

这需要一些工作,因为您需要定义要加入的列,以及您用于第3个表的列。

编辑

由于您似乎不需要将数据放入第3个表格,因此有2个简单的选项

将zip_code设置为唯一键,然后使用以下命令: -

INSERT IGNORE INTO testing.table_name
(zip_code, city, lat, lon) 
SELECT zip-new.zip_code, zip-new.city, zip-new.lat, zip-new.lon
FROM testing.zip-new

这将忽略任何为已存在的邮政编码插入记录的尝试。

如果要检查,请将其作为连接进行(使用 NOT IN(子查询...)语法应该更有效

INSERT INTO testing.table_name
(zip_code, city, lat, lon) 

SELECT zip-new.zip_code,
    zip-new.city,
    zip-new.lat,
    zip-new.lon,
FROM testing.zip-new
LEFT OUTER JOIN testing.table_name ON testing.zip-new.zip_code = testing.table_name.zip_code
WHERE testing.table_name.zip_code IS NULL