2010-07-15 20 views
7

Tìm cách easist/có khả năng mở rộng nhất để thực hiện "sự khác biệt" trong SQL Server xem bên dưới. alt textSự khác biệt của Máy chủ SQL (đối diện với giao lộ)

Nếu bạn không thể nói từ hình ảnh tôi đang tìm mọi thứ không có trong giao lộ.

Tôi đã thấy một cách để làm điều đó:

select * from (  
    (select 'test1' as a, 1 as b) 
union all 
    (select 'test2' as a , 2 as b union all select 'test1' as a , 1 as b) 
)un group by a,b having count(1)=1 

Nhưng tôi sợ những gì sẽ xảy ra nếu tôi sử dụng hai bộ lớn (i sẽ không được truy vấn từ chọn '' tuyên bố không đổi, truy vấn của tôi sẽ được kéo từ các bảng thực)

EDIT:.

giải pháp có thể xảy ra ...

drop table #temp_a; 
drop table #temp_b; 

go 


    select * into #temp_a from (
    select 1 as num, 'String' as two, 'int'as three, 'purple' as four union all 
    select 2 as num, 'dog' as two, 'int'as three, 'purple' as four union all 
    select 3 as num, 'dog' as two, 'int'as three, 'cat' as four) a 

select * into #temp_b from (
    select 1 as num, 'String' as two, 'decimal'as three, 'purple' as four union all 
    select 2 as num, 'dog' as two, 'int'as three, 'purple' as four union all 
    select 3 as num, 'dog' as two, 'int'as three, 'dog' as four) b 





    SELECT IsNull(a.num, b.num) A,IsNull(a.two, b.two) B, IsNull(a.three, b.three) C,     
     IsNull(a.four, b.four) D 
    FROM #temp_a a 
    FULL OUTER JOIN #temp_b b ON (a.num=b.num AND a.two=b.two and a.three=b.three and a.four=b.four) 
    WHERE (a.num is null or b.num is null ) 

KẾT QUẢ:

1 chuỗi int tím

3 con chó int mèo

1 Chuỗi Tháng Mười Hai tím

3 con chó int chó

Trả lời

15

Làm thế nào về một cái gì đó như thế này ?

SELECT A, B FROM Table1 EXCEPT SELECT A,B FROM Table2 
UNION 
SELECT A, B FROM Table2 EXCEPT SELECT A,B FROM Table1 

Dưới đây là một ví dụ với toán tử FULL OUTER phương pháp JOIN (giả sử A là không nullable trong cả hai bảng)

SELECT IsNull(Table1.A, Table2.A) a,IsNull(Table1.B, Table2.B) B 
FROM Table1 
FULL OUTER JOIN Table2 ON (Table1.A=Table2.A AND Table1.B=Table2.B) 
WHERE Table1.A is null or Table2.A is null 
+0

không phần IsNull đạt được gì? Nó chỉ là một phương tiện để "hiển thị" những gì còn thiếu? – Nix

+1

Đối với các hàng chỉ có một bản ghi trong một trong các bảng (những cái bạn muốn) sẽ có một giá trị rỗng trong một bảng hoặc bảng kia. Ví dụ, Bảng 1..A sẽ là null hoặc Bảng2.A sẽ là null cho mỗi hàng. Isnull lấy giá trị từ phía nào có giá trị. – JohnFx

5

gì bạn đang sau được gọi là một Full Outer Join, which SQL Server supports.

+0

Ban đầu tôi nghĩ như sau: chọn * từ (chọn 'test1' làm a, 1 là b) Một 1 là b) Hai \t TRÊN One.a <> Two.a AND One.b <> Two.b Tuy nhiên, không phải (chạy cả hai SQL) –

+1

có, nhưng bạn cũng phải lọc ra tất cả các kết quả phù hợp sau join: 'WHERE keyA là NULL HOẶC keyB là NULL' –

+1

Phép nối ngoài đầy đủ KHÔNG phải là câu hỏi đang hỏi. Một phép nối ngoài đầy đủ sẽ là Sơ đồ Venn hoàn toàn được điền vào, không chỉ các phần không giao nhau của Sơ đồ Venn. – Dogs

9

Alternative:

SELECT A, B FROM Table1 UNION SELECT A,B FROM Table2 
EXCEPT 
SELECT A, B FROM Table2 INTERSECT SELECT A,B FROM Table1 
Các vấn đề liên quan