2010-07-17 19 views
11

Tôi đang tìm các bài viết hoặc bài viết nghiên cứu áp dụng thuật toán Longest Common Subsquence cho các bảng SQL để có được chế độ xem dữ liệu khác. Các sugestions khác về cách giải quyết một vấn đề khác biệt bảng cũng được hoan nghênh. Thách thức được rằng bảng SQL có thói quen khó chịu này của geting thay BIG và áp dụng các thuật toán đơn giản được thiết kế cho việc xử lý văn bản có thể dẫn đến một chương trình mà không bao giờ kết thúc ...Khác biệt dữ liệu dựa trên SQL: subsequence phổ biến dài nhất

nên được đưa ra một bảng Original:

Key Content 
1 This row is unchanged 
2 This row is outdated 
3 This row is wrong 
4 This row is fine as it is 

và bảng New:

Key Content 
1 This row was added 
2 This row is unchanged 
3 This row is right 
4 This row is fine as it is 
5 This row contains important additions 

tôi cần phải tìm ra Diff:

+++ 1 This row was added 
--- 2 This row is outdated 
--- 3 This row is wrong 
+++ 3 This row is right 
+++ 5 This row contains important additions 
+1

Chỉ cần rõ ràng, 'Khóa' áp đặt một hàng trên các hàng, nếu không các thuật ngữ như 'chuỗi' và 'subsequence' sẽ không ý nghĩa trên một tập hợp không có thứ tự (như một bảng quan hệ). –

+1

Đừng quên rằng các bảng không, theo lý thuyết, có bất kỳ thứ tự nào cho các hàng - điều này cũng làm phức tạp mọi thứ. Bạn phải xác định thứ tự cho các so sánh bảng. –

+2

Tôi không nghĩ rằng đây là bất kỳ khác nhau từ các vấn đề thông thường: tốt nhất bạn có thể làm là O (n^2) (bỏ qua thời gian để so sánh các hàng bảng) trong đó n là số hàng. Nếu bạn biết rằng không có hàng nào di chuyển nhiều hơn k vị trí, bạn có thể làm điều đó trong O (nk) bằng cách sửa đổi thuật toán lập trình động thông thường. Bạn có thể sẽ phải giả định một cái gì đó như thế này, với một số k hợp lý nhỏ, nếu n^2 là quá lớn. – ShreevatsaR

Trả lời

1

Nếu bạn xuất tabls của bạn vào file csv, bạn có thể sử dụng http://sourceforge.net/projects/csvdiff/

Trích: csvdiff là một kịch bản Perl để diff/so sánh hai tập tin csv với khả năng để chọn dấu phân cách. Sự khác biệt sẽ được hiển thị như: "Cột XYZ trong bản ghi 999" là khác nhau. Sau đó, kết quả mong đợi thực tế và cho cột này sẽ được hiển thị.

0

Điều này có lẽ quá đơn giản đối với những gì bạn đang theo dõi và không phải nghiên cứu :-), mà chỉ là khái niệm. Tôi tưởng tượng bạn đang tìm kiếm để so sánh các phương pháp khác nhau để xử lý trên không (?).

--This là một nửa của những gì bạn không muốn (A)

SELECT o.Key FROM tbl_ORIGINAL o INNER JOIN tbl_NEW n WHERE o.Content = n.Content 

--This là nửa còn lại của những gì bạn không muốn (B)

SELECT n.Key FROM tbl_ORIGINAL o INNER JOIN tbl_NEW n WHERE o.Content = n.Content 

--This là một nửa của những gì bạn muốn DO (C)

SELECT '+++' as diff, n.key, Content FROM tbl_New n WHERE n.KEY NOT IN(B) 

--This là nửa còn lại của những gì bạn muốn DO (D)

SELECT '---' as diff, o.key, Content FROM tbl_Original o WHERE o.Key NOT IN (A) 

--Combining C & D

(C) 
Union 
(D) 
Order By diff, key 

Cải tiến ...

  • thử tạo quan điểm lập chỉ mục của bảng cơ sở đầu tiên
  • thử giảm độ dài của nội dung trường đến tối thiểu là tính độc đáo (dùng thử/lỗi) và sau đó hãy sử dụng kết quả ngắn hơn để thực hiện các so sánh

- ví dụ:để có được độ dài tối thiểu (1000 là tùy ý - chỉ cần một lối ra)

declare @i int 
set @i = 1 
While i < 1000 and Exists (
Select Count(key), Left(content,@i) From Table Having Count(key) > 1) 
BEGIN 
    i = @i + 1 
END 
Các vấn đề liên quan