2010-04-08 36 views
6

Khi viết chế độ xem và làm tổ các chế độ xem trong chế độ xem sâu hơn, đôi khi tôi bỏ lỡ thứ gì đó và cuối cùng mất hàng/dữ liệu. Làm cách nào để kiểm tra xem các cột từ hai bảng khác nhau có khớp chính xác dữ liệu?Xác minh hai cột của hai bảng khác nhau khớp chính xác với

Ví dụ:

select count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2); 

này sẽ trả lại số giá trị trong table1.col1 mà không phải là trong table2. Tuy nhiên, tôi không biết rằng đây là một giải pháp tốt vì nó không đếm các giá trị table2.col1 không tồn tại trong table1.col1.

+0

Tất nhiên các chế độ xem làm tổ thường là một điều xấu (Ít nhất trong SQL Server). Nó có vẻ tốt trong phát triển, nhưng một khi bạn đi đến sản và có rất nhiều hồ sơ, bạn có thể mang hệ thống xuống bằng cách làm tổ các khung nhìn. Tôi muốn kiểm tra các khung nhìn lồng nhau đó bằng cách thêm một số bản ghi thử nghiệm lên tới hàng triệu bảng cơ sở. – HLGEM

+0

thực sự, tôi cuối cùng sẽ viết lại các truy vấn, tạo ra một chuỗi các khung nhìn lồng nhau là để chứng minh khái niệm ngay từ đầu để xác minh rằng dữ liệu được định dạng theo cách tôi muốn. Tôi sẽ cấu trúc lại các khung nhìn khi cơ sở dữ liệu được triển khai. – galford13x

Trả lời

3

Sử dụng:

SELECT MAX(x.t1_missing_count) AS t1_missing_count, 
     MAX(x.t2_missing_count) AS t2_missing_count 
    FROM (
SELECT COUNT(DISTINCT t1.col1) AS t1_missing_count, 
     NULL AS t2_missing_count 
    FROM TABLE_1 t1 
WHERE t1.col1 NOT IN (SELECT DISTINCT t2.col1 
         FROM TABLE_2 t2) 
UNION ALL 
SELECT NULL, 
     COUNT(DISTINCT t2.col1),   
    FROM TABLE_2 t2 
WHERE t2.col1 NOT IN (SELECT DISTINCT t1.col1 
         FROM TABLE_1 t1)) x 
+0

không chắc chắn lý do tại sao tôi không nghĩ đến việc sử dụng UNION. Vì vậy, tôi lấy nó bằng cách sử dụng một truy vấn phụ khoản NOT IN là ok cho một hoạt động như thế này? – galford13x

+0

@ galford13x: Tôi không có thông tin về cái nào trong số ba - KHÔNG tồn tại, KHÔNG IN, và LEFT JOIN/IS NULL - là cách hiệu quả nhất để sử dụng tại thời điểm này. –

0
declare @count int, @count2 int 


select @count = count(distinct table1.col1) 
    from table1 
where table1.col1 not in (select distinct table2.col1 
          from table2) 

select @count2 = count(distinct table2.col1) 
    from table2 
where table2.col1 not in (select distinct table1.col1 
          from table1) 

select @count + @count2 
+0

Sử dụng SQLite, tôi có thể sử dụng các biến nội bộ như MS SQL hoặc MySQL không? – galford13x

+0

Hmm, đã được gắn thẻ lại, tôi nghĩ rằng tôi đã kiểm tra kiểu Sql ... –

+0

Tôi không nghĩ rằng nó đã được gắn thẻ lại, nhưng nó được gắn thẻ SQL :) – galford13x

1
select count(*) from (

select 
table1.col1 from table1 left join table2 on table1.col1 = table2.col2 
where table2.col1 is null 

union 

select table2.col1 from table2 left join table 1 on table2.col1 = table1.col1 
where table1.col1 is null 

) 
6

Bạn có thể sử dụng hai EXCEPT truy vấn (hoặc công đoàn chúng) để kiểm tra:

SELECT DISTINCT col1 
FROM table1 
EXCEPT 
SELECT DISTINCT col1 
FROM table2 

Điều đó sẽ hiển thị các giá trị tồn tại trong table1, nhưng không phải bảng 2. Sau đó chạy lại với tên bảng lật ngược lại.

+0

Tôi thích sự đơn giản. Tôi quấn cái này bằng số đếm SELECT() để có được số khác biệt. Cảm ơn. – galford13x

Các vấn đề liên quan