首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >mysql -删除父级子关系后保存唯一记录

mysql -删除父级子关系后保存唯一记录
EN

Stack Overflow用户
提问于 2017-10-16 09:30:28
回答 1查看 281关注 0票数 6

在mysql数据库中,我有一个业务单元表,它维护客户的业务单元的层次结构。每个业务单元都可以有一个父和/或一个子业务。

products_client_1.business_units

代码语言:javascript
复制
id  parent_id
1   
2   1
3   1
4   1
8   1
14  3
17  2
31  1
35  4
36  1
37  4
38  2
39  31
40  8
41  3
42  31
43  
44  43

目前,我有一个customerId表,它在业务单元级别上维护customerId。

contacts_client_1.buid_customer_id

代码语言:javascript
复制
global_id   customer_id bu_id   
ABC1000033  1812130     2
ABC1000033  1812130     54
ABC1000034  4049809     2
ABC1000035  5630631     2
ABC1000082  5707052     2
ABC1000082  1111116     54
ABC1000091  5813085     2
ABC1000091  5813085     54
ABC1000093  5208477     2
ABC1000115  5045891     2
ABC1000115  5045891     54
ABC1000117  6114245     2
ABC1000117  6114247     54
ABC1000117  6114247     1
ABC1000111  1234567     38
ABC1000100  9023456     43
ABC1000100  9023457     44

接下来,我不想在单个业务单元级别上维护客户id。对于给定的globalId,它应该是唯一的。为此,我希望基于以下条件迁移现有的客户id数据。

如果一个globalId只有一个BU的customerId,那么就像没有bu_id那样迁移它。

如果globalId有2总线的customerId (它们可以是任何级别的父-子总线),则保留父总线的customerId最可用的BU。

必需表contacts_client_1.customer_id

代码语言:javascript
复制
global_id   customer_id
ABC1000033  1812130
ABC1000034  4049809
ABC1000035  5630631
ABC1000082  5707052
ABC1000091  5813085
ABC1000093  5208477
ABC1000100  9023456
ABC1000111  1234567
ABC1000115  5045891
ABC1000117  6114247

PS:globalId在不同的父总线之间没有重叠。

business_unit表在products_client_1模式下,buid_customer_id表在contacts_client_1模式下。

相同的代码应该适用于不同的客户端.

这是一次迁移.

在编写查询时需要帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-21 13:39:24

我不知道您将如何处理您的数据,但以下内容应该会有所帮助:

只显示在global_id表中没有父级的行:

代码语言:javascript
复制
select child.*
from contacts_client_1.buid_customer_id child
left join products_client_1.business_units bu
  on bu.id = child.bu_id
left join contacts_client_1.buid_customer_id parent
  on  parent.global_id = child.global_id
  and parent.bu_id     = bu.parent_id
where parent.global_id is null

示例:

  • (ABC1000100 9023456 43) -- bu_id (43)在buid_customer_id中没有父级,因此第一个左联接没有匹配,第二个也没有匹配。因为左边联接表中的所有列都是空的,所以parent.global_id is null是真的,行将被选中。
  • (ABC1000100 9023457 44) -- bu_id (44)有一个parent_id (43),所以第一个连接将找到一个匹配的。第二个联接也将找到一个匹配,因为在global_id表中存在一个具有父BU和相同buid_customer_id的行。因此,parent.global_id不是NULL,行也不会被选中。
  • (ABC1000033 1812130 2) - bu_id (2)有一个parent_id (1)。第一个连接将找到匹配。但是buid_customer_id表中没有bu_id = 1global_id = ABC1000033的行,所以第二个联接没有匹配。因此,parent.global_id将为NULL,行将被选中。

现在,您可以使用以下语句将数据复制(迁移)到一个新的表中

代码语言:javascript
复制
insert into new_table
    select child.*
    [..]

你也可以往另一边走。如果用内部联接替换左联接并删除WHERE子句,则会得到相反的结果(第一个查询未返回的所有行)。您可以使用它从表中删除所有这些行。

删除具有相同global_id的父行的所有行

代码语言:javascript
复制
delete child
from contacts_client_1.buid_customer_id child
join products_client_1.business_units bu
  on bu.id = child.bu_id
join contacts_client_1.buid_customer_id parent
  on  parent.global_id = child.global_id
  and parent.bu_id     = bu.parent_id

现在,表buid_customer_id将包含由第一个查询选择的相同行。如果这些数据需要放在另一个表中,只需重命名它。然后,您可以使用

代码语言:javascript
复制
insert into customer_id (global_id, customer_id)
    select global_id, customer_id
    from new_table
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46767051

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档