Tổng quan
tôi sẽ cung cấp cho bốn giải pháp, bắt đầu với đơn giản nhất. Với mỗi giải pháp, tôi sẽ giải thích các tình huống trong đó nó sẽ được áp dụng.
Mỗi giải pháp giả định rằng cơ sở dữ liệu A và B có các bảng sau:
create table Terms
(
ID int identity(1,1),
Text nvarchar(MAX)
)
create table Relationships
(
ParentID int,
ChildID int
)
Giải pháp 1
Đây là giải pháp đơn giản nhất. Nó nên được sử dụng nếu:
- khoản với nội dung giống hệt nhau có thể được sáp nhập lại với nhau
Sau đây sẽ hợp nhất tất cả các điều khoản và các mối quan hệ từ A vào B:
insert into A.Terms (Text)
select Text
from A.Terms
where Text not in (select Text from B.Terms)
insert into B.Relationships (ParentID, ChildID)
select
(select ID
from B.Terms BTerms inner join A.Terms ATerms on BTerms.Text = ATerms.Text
where ATerms.ID = Relationships.ParentID),
(select ID
from B.Terms BTerms inner join A.Terms ATerms on BTerms.Text = ATerms.Text
where ATerms.ID = Relationships.ChildID)
from A.Relationships
Về cơ bản bạn copy đầu tiên các điều khoản, sau đó sao chép các mối quan hệ ánh xạ id cũ sang id mới dựa trên văn bản.
Lưu ý: Trong câu hỏi của bạn, bạn nêu rõ các điều khoản được phân tách giữa hai cơ sở dữ liệu đầu vào. Trong trường hợp đó, mệnh đề where
trong insert into
đầu tiên có thể bị bỏ qua.
Giải pháp 2
Đây là giải pháp tiếp theo đơn giản nhất. Nó nên được sử dụng nếu:
- khoản có cùng nội dung phải được giữ riêng biệt, và
- Bạn có thể thêm một cột vào bảng điểm đến
Đầu tiên thêm một cột int bảng khoản của bạn gọi là "OldID", sau đó sử dụng sau đây để hợp nhất tất cả các điều khoản và các mối quan hệ từ A đến B:
insert into A.Terms (Text, OldID)
select Text, ID
from A.Terms
where Text not in (select Text from B.Terms)
insert into B.Relationships (ParentID, ChildID)
select
(select ID from B.Terms where OldID = ParentID),
(select ID from B.Terms where OldID = ChildID)
from A.Relationships
giải pháp 3
Giải pháp này sử dụng lặp lại.Nó nên được sử dụng nếu:
- khoản có cùng nội dung phải được giữ riêng biệt, và
- Bạn không thể sửa đổi các bảng đích, và
- Hoặc (a) cột ID của bạn là một cột sắc (trong Oracle, điều này có nghĩa nó có một kích hoạt sử dụng một chuỗi), hoặc (b) bạn muốn có một phương pháp chung mà sẽ làm việc với bất kỳ công nghệ cơ sở dữ liệu
sau đây sẽ hợp nhất tất cả các điều khoản và relat ionships từ A vào B:
declare TermsCursor sys_refcursor;
begin
-- Create temporary mapping table
create table #Temporary (OldID int, NewID int)
-- Add terms one at a time, remembering the id mapping
open TermsCursor for select * from A.Terms;
for term in TermsCursor
loop
insert into B.Terms (Text) values (term.Text) returning ID into NewID;
insert into Temporary (OldID, NewID) values (term.ID, NewID);
end loop;
-- Transfer the relationships
insert into B.Relationships (ParentID, ChildID)
select
(select ID
from B.Terms BTerms inner join Temporary on BTerms.ID = Temporary.NewID
where Temporary.OldID = Relationships.ParentID),
(select ID
from B.Terms BTerms inner join Temporary on BTerms.ID = Temporary.NewID
where Temporary.OldID = Relationships.ChildID),
from A.Relationships
-- Drop the temporary table
drop table #Temporary
end
Giải pháp 4
Giải pháp này là Oracle-cụ thể, đòi hỏi bạn phải biết trình tự sử dụng để tạo ra giá trị ID, và kém hiệu quả hơn so với một số các giải pháp khác . Nó nên được sử dụng nếu:
- khoản có cùng nội dung phải được giữ riêng biệt, và
- Bạn không thể sửa đổi các bảng đích, và
- Bạn có thể truy cập đến trình tự mà tạo ra cột ID của bạn, và
- Bạn đang sử dụng một ok techinique rằng sẽ không cổng để một công nghệ cơ sở dữ liệu Oracle phi
sau đây sẽ hợp nhất tất cả các điều khoản và các mối quan hệ từ A vào B:
-- Create temporary mapping table
create table #Temporary (OldID int, NewID int)
-- Add terms to temporary mapping table
insert into #Tempoarary (OldID, NewID)
select ID, sequence.nexval
from A.Terms
-- Transfer the terms
insert into B.Terms (ID, Text)
select NewID, Text
from A.Terms inner join Temporary on ID = OldID
-- Transfer the relationships
insert into B.Relationships (ParentID, ChildID)
select
(select ID
from B.Terms BTerms inner join Temporary on BTerms.ID = Temporary.NewID
where Temporary.OldID = Relationships.ParentID),
(select ID
from B.Terms BTerms inner join Temporary on BTerms.ID = Temporary.NewID
where Temporary.OldID = Relationships.ChildID),
from A.Relationships
-- Drop the temporary table
drop table #Temporary
Không thực sự là câu trả lời nhưng bạn có cân nhắc sử dụng tập lệnh perl hoặc python để xử lý việc di chuyển không? – Pace
Tôi sợ SQL đến cấu trúc cây thực sự giống như chốt vuông đến một lỗ tròn. Doable chỉ sử dụng quá nhiều lực lượng vũ phu. –
Không phải là câu trả lời cho câu hỏi của bạn, nhưng có lý do cụ thể nào để có mối quan hệ cha/con của bạn trong một bảng riêng biệt không? Nếu mỗi cụm từ chỉ có thể có một phụ huynh, thì bảng điều khoản có thể có cột Gốc. Khi bạn cần tìm con, bạn có thể sử dụng câu lệnh 'select-from-connect by-start with'. Điều này cũng sẽ làm cho các nút gốc rõ ràng hơn, vì cột cha của chúng sẽ là rỗng. – Aaron