2017-10-16 16 views
6

Trong cơ sở dữ liệu mysql, tôi có một bảng Đơn vị kinh doanh duy trì hệ thống phân cấp của các đơn vị kinh doanh của khách hàng. Mỗi đơn vị kinh doanh có thể có một phụ huynh và/hoặc một đứa trẻ.mysql - Lưu giữ hồ sơ duy nhất sau khi xóa mối quan hệ cha mẹ con

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 

Hiện nay, tôi có một bảng ID khách hàng mà duy trì ID khách hàng ở mức độ đơn vị kinh doanh

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 

Trong tương lai , Tôi không muốn duy trì custo mer id ở cấp đơn vị kinh doanh cá nhân. Nó phải là duy nhất cho một globalId đã cho. Đối với điều này, tôi muốn di chuyển dữ liệu id khách hàng hiện tại dựa trên điều kiện sau.

Nếu globalId có customerId cho một BU duy nhất, hãy di chuyển nó vì không có bu_id.

Nếu globalId có customerId cho 2 BU (chúng có thể là cha mẹ-con ở mọi cấp độ), hãy giữ ID khách hàng của cha mẹ có sẵn BU nhất.

cần bảng 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 không chồng chéo giữa các cha mẹ khác nhau hầu hết xe buýt.

bảng business_unit nằm trong lược đồ products_client_1 và bảng buid_customer_id nằm trong lược đồ contacts_client_1.

Mã giống nhau phải được thực thi cho các khách hàng khác nhau.

Đây là lần di chuyển một lần.

Cần trợ giúp khi viết truy vấn.

+0

Bạn có muốn xóa các hàng trong bảng 'buid_customer_id' không? –

+1

Điều gì xác định "khả dụng nhất"? Trong dữ liệu mẫu của bạn, vui lòng đánh dấu những dữ liệu nào cần xóa. –

+0

Tôi muốn cột BU_ID bị xóa. Hiện tại, khóa chính là Global_id + BU_ID. Khách hàng_id ở cấp BU. Bây giờ tôi muốn loại bỏ ràng buộc này và lưu trữ nó ở cấp độ máy khách. Dữ liệu hiện có sẽ được di chuyển sang bảng mới chỉ có Global_id làm khóa chính. –

Trả lời

0

Tôi không chắc chắn chính xác những gì bạn sẽ làm gì với dữ liệu của bạn, nhưng những điều sau đây sẽ giúp:

Chỉ hàng mà không có cha mẹ cho cùng global_id trong bảng 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 

Ví dụ:

  • Row (ABC1000100 9023456 43) - Các bu_id (43) không có cha mẹ ở buid_customer_id, vì vậy sẽ không có mat ch cho LEFT JOIN đầu tiên và cũng không khớp với thứ hai. Vì tất cả các cột từ các bảng được nối bên trái sẽ là NULL, parent.global_id is null là TRUE và hàng sẽ được chọn.
  • Hàng (ABC1000100 9023457 44) - bu_id (44) có parent_id (43), vì vậy JOIN đầu tiên sẽ tìm thấy kết quả phù hợp.JOIN thứ hai cũng sẽ tìm thấy một kết quả phù hợp, bởi vì một hàng có BU cha và cùng một số global_id tồn tại trong bảng buid_customer_id. Do đó parent.global_id không phải là NULL và hàng sẽ không được chọn.
  • Hàng (ABC1000033 1812130 2) - bu_id (2) có parent_id (1). JOIN đầu tiên sẽ tìm thấy một trận đấu. Nhưng tere không có hàng trong bảng buid_customer_id với bu_id = 1global_id = ABC1000033, do đó không có kết quả phù hợp cho JOIN thứ hai. Do đó parent.global_id sẽ là NULL và hàng sẽ được chọn.

Bây giờ bạn có thể sử dụng báo cáo này để sao chép (di chuyển) dữ liệu vào một bảng mới với

insert into new_table 
    select child.* 
    [..] 

Bạn cũng có thể đi theo con đường khác. Nếu bạn thay thế LEFT JOINs bằng INNER JOIN và loại bỏ mệnh đề WHERE, bạn sẽ nhận được kết quả ngược lại (tất cả các hàng không được trả về bởi truy vấn đầu tiên). Bạn có thể sử dụng nó để xóa tất cả các hàng đó khỏi bảng.

Xóa tất cả các hàng mà có một hàng mẹ cho cùng 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 

Bây giờ bảng buid_customer_id sẽ chứa các hàng tương tự mà được lựa chọn bởi các truy vấn đầu tiên. Nếu dữ liệu này cần phải ở trong một bảng khác - chỉ cần đổi tên nó. Sau đó, bạn có thể sao chép global_idcustomer_id với

insert into customer_id (global_id, customer_id) 
    select global_id, customer_id 
    from new_table 
Các vấn đề liên quan