在mysql数据库中,我有一个业务单元表,用于维护客户的业务单元的层次结构。每个业务部门都可以有父母和/或孩子。
products_client_1.business_units
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
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个BU的customerId(它们可以是任何级别的父子),请保留父级最佳可用BU的customerId。
必填表 contacts_client_1.customer_id
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不会在不同的父母大多数BU之间重叠。
business_unit表位于products_client_1架构下,buid_customer_id表位于contacts_client_1架构下。
对于不同的客户端,相同的代码应该是可执行的。
这是一次性迁移。
在编写查询时需要帮助。
答案 0 :(得分:0)
我不确定您的数据到底是什么,但以下情况应该有所帮助:
仅显示global_id
表中同一buid_customer_id
的父级没有父级的行:
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
中没有父级,因此第一个LEFT JOIN不匹配,第二个也不匹配。由于左连接表中的所有列都将为NULL,因此parent.global_id is null
为TRUE,并且将选择该行。(ABC1000100 9023457 44)
- bu_id
(44)有parent_id
(43),因此第一个JOIN会找到匹配项。第二个JOIN也会找到匹配项,因为global_id
表中存在具有父BU和相同buid_customer_id
的行。因此parent.global_id
不为NULL,并且不会选择该行。(ABC1000033 1812130 2)
- bu_id
(2)有一个parent_id
(1)。第一个JOIN将找到匹配项。但是,buid_customer_id
表中的bu_id = 1
和global_id = ABC1000033
中没有行,因此第二个JOIN没有匹配项。因此parent.global_id
将为NULL,并且将选择该行。现在,您可以使用此语句将数据复制(迁移)到具有
的新表insert into new_table
select child.*
[..]
你也可以走另一条路。如果用INNER JOIN替换LEFT JOIN并删除WHERE子句,则会得到相反的结果(第一个查询未返回的所有行)。您可以使用它从表中删除所有这些行。
删除具有相同global_id
的父行的所有行:
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
将包含第一个查询选择的相同行。如果这些数据需要在另一个表中 - 只需重命名即可。然后,您可以使用
global_id
和customer_id
insert into customer_id (global_id, customer_id)
select global_id, customer_id
from new_table