【问题标题】:Lookup different customer ID across multiple tables using different fields使用不同字段在多个表中查找不同的客户 ID
【发布时间】:2021-01-17 20:13:04
【问题描述】:

我正在尝试在包含购买数据的新表和我的历史数据库之间创建一个查找列,每个客户的主 ID 都不同。 主要问题是一些客户在历史数据库中没有电子邮件地址,但他们在我们的新系统中总是有一个。 语言是 mySQL

这是表格:

对于新数据库 - 我们称之为 new_data

对于旧数据库 - 我们称之为 old_data

我想得到什么(对不起,我忘了格式化日期)

我尝试了两种方法:

  1. 进行两次连接,首先在电子邮件字段上,然后在名称上。主要问题是,即使我输入了不同的值,我也会得到大量重复的值。
select distinct * 
from new_data as n
left join old_data as c
on c.email = n.email
left join old_data as d 
on  d.name= n.c_name
  1. 使用条件跨多个字段进行连接,我得到了更多的行返回
select distinct * from 
new_data n
left join old_data c
on c.email = n.email or  c.name= n.name

【问题讨论】:

  • 我看到严格的Name 匹配 - 为什么您还尝试通过email 加入?也许您的样本数据不充分?展开...并将其显示为格式化文本,而不是图片。
  • 因为有些人可能在我的数据库中有相同的名字,所以我想先交叉检查电子邮件。大约 10% 的样本数据在旧数据库中丢失了电子邮件。
  • 如果是这样,则替换数据样本并发布代表性样本。它必须显示在查询创建期间必须考虑的所有可能组合。
  • email 列是否定义为 UNIQUE?它不能包含重复项吗?同一封邮件的名称在新旧表中是否可能不同?
  • DISTINCT * 是矛盾的。如需更多帮助,请参阅meta.stackoverflow.com/questions/333952/…

标签: mysql database join merge snowflake-cloud-data-platform


【解决方案1】:

如果您想先在电子邮件字段上加入,如果没有找到,然后在名称上,就这样做:

select n.id new_id, email.id old_id_by_email, name.id old_id_by_name
from new_data n
left join old_data email on email.email=n.email
left join old_data name on email.id is null and name.name=n.name

如果您为每个 new_id 获得不止一行,您应该考虑您想要什么(最低的旧 id?按某个日期排序?)。

要设置旧的 id,

update new_data n
left join old_data email on email.email=n.email
left join old_data name on email.id is null and name.name=n.name
set n.old_id=coalesce(email.id,name.id)
where n.old_id is null;

或者只使用两个更新:

update new_data
join old_data on old_data.email=new_data.email
set new_data.old_id=old_data.id
where new_data.old_id is null;

update new_data
join old_data on old_data.name=new_data.name
set new_data.old_id=old_data.id
where new_data.old_id is null;

我不完全确定您要使用 distinct 做什么,但假设每个表都有一个主键,distinct * 永远不会删除任何行,因为总会有一些差异;也许你想以某种方式使用group by

以上更新假设mysql;对于雪花,我没有立即看到如何使用左连接,但您可以执行两个更新,例如(未经测试):

update new_data
set new_data.old_id=old_data.id
from old_data 
where new_data.old_id is null and old_data.email=new_data.email;

update new_data
set new_data.old_id=old_data.id
from old_data 
where new_data.old_id is null and old_data.name=new_data.name;

【讨论】:

  • 我试图通过使用 distinct 删除重复的行。谢谢你的回答。我了解第一个查询块,但我不确定更新。当我运行更新查询时,它给了我一个错误,说意外加入。我需要添加任何/选择吗?抱歉我不熟悉更新声明
  • SQL 编译错误:位置 0 的语法错误第 2 行意外“左”。我正在使用 Snowflake,它的运行方式与 mySQL 相同
  • snowflake 不是 mysql 并且没有相同的语法。我将添加到我的答案中
猜你喜欢
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-19
相关资源
最近更新 更多