2011-10-11 35 views
5
Table 1    Table 2 
Number | Code  Code | Description 
1234  A   A  Something 
1235  B   C  Something else 
1246  C   D  Something other 
1247  A 
1248  B 
1249  A 

Tôi muốn tìm ra Code giá trị khác biệt và nhận được lợi như thế này:Truy vấn SQL để tìm các giá trị khác biệt trong hai bảng?

1 | 2 
------- 
A  A 
B 
C  C 
     D 

tôi không thể tìm ra cách để viết một truy vấn SQL sẽ trở lại cho tôi những kết quả trên. Bất cứ ai có bất kỳ kinh nghiệm với một truy vấn như thế này hay tương tự?

Trả lời

10

Trong RDBMS thích hợp:

SELECT 
    T1.Code, T2.Code 
FROM 
    (SELECT DISTINCT Code FROM Table1) T1 
    FULL OUTER JOIN 
    (SELECT DISTINCT Code FROM Table2) T2 
       ON T1.Code = T2.Code 

Trong MySQL ... UNION loại bỏ bản sao

SELECT 
    T1.Code, T2.Code 
FROM 
    Table1 T1 
    LEFT OUTER JOIN 
    Table2 T2 ON T1.Code = T2.Code 
UNION 
SELECT 
    T1.Code, T2.Code 
FROM 
    Table1 T1 
    RIGHT OUTER JOIN 
    Table2 T2 ON T1.Code = T2.Code 
+0

A " RDBMS đúng "sẽ không tạo ra các giá trị rỗng, có lẽ sẽ sử dụng các thuộc tính có giá trị quan hệ cho loại truy vấn này;) – onedaywhen

2

gì bạn đang tìm kiếm là một full outer join:

select a.code as code_1,b.code as code_2 
from(
    select code 
    from table1 
    group by 1 
)a 
full outer join(
    select code 
    from table2 
    group by 1 
)b 
using(code) 
order by 1; 
+0

Những loại OUTER JOIN? – gbn

+0

@gbn - Một 'bên ngoài tham gia đầy đủ': http://en.wikipedia.org/wiki/Join_(SQL)#Full_outer_join –

+0

yep, nhưng bạn phải thêm nó :-) Bạn sẽ thấy tôi sử dụng một bên dưới. .. – gbn

-1

Cái gì như:

CHỌN tbl1.Code DISTINCT như 1, tbl2.Code TỪ tbl1 LEFT JOIN tbl2 ON tbl1.Code = tbl2 .Code

+0

Điều này sẽ không giúp bạn có được hàng cuối cùng: , D –

+0

Oh yeah, tôi đã bỏ lỡ - xin lỗi – ollie

-1

Điều này thực sự trông giống như một UNION của hai kết nối bên ngoài. Hãy thử điều này:

SELECT t1.Code, t2.Code 
FROM Table1 AS t1 
LEFT JOIN Table2 AS t2 ON t1.Code 

UNION 

SELECT t1.Code, t2.Code 
FROM Table1 AS t1 
RIGHT JOIN Table2 AS t2 ON t1.Code 

ORDER BY 1, 2 

Thao tác UNION sẽ chỉ giữ giá trị riêng biệt.

0

Bí quyết sẽ là để có được những giá trị khác biệt từ hai bảng, một cái gì đó như thế này:

SELECT a.Code, b.code 
FROM 
(--Get the DISTICT Codes from all sets 
    SELECT Distinct Code from Table1 
    UNION SELECT Distinct Code from Table2 
) x Left JOIN 
Table1 a ON x.code = a.Code LEFT JOIN 
Table2 b ON x.code = b.Code 
2

Trong SQL chuẩn, sử dụng toán tử quan hệ và tránh null:

SELECT Code AS col_1, Code AS col_2 
    FROM Table_1 
INTERSECT 
SELECT Code AS col_1, Code AS col_2 
    FROM Table_2 

UNION 

SELECT Code AS col_1, 'missing' AS col_2 
    FROM Table_1 
EXCEPT 
SELECT Code AS col_1, 'missing' AS col_2 
    FROM Table_2 

UNION 

SELECT 'missing' AS col_1, Code AS col_2 
    FROM Table_2 
EXCEPT 
SELECT 'missing' AS col_1, Code AS col_2 
    FROM Table_1; 

Một lần nữa trong tiêu chuẩn SQL, lần này sử dụng cấu trúc mà MySQL thực sự hỗ trợ:

SELECT Code AS col_1, Code AS col_2 
    FROM Table_1 
WHERE EXISTS (
       SELECT * 
       FROM Table_2 
       WHERE Table_2.Code = Table_1.Code 
      ) 

UNION 

SELECT Code AS col_1, 'missing' AS col_2 
    FROM Table_1 
WHERE NOT EXISTS (
        SELECT * 
        FROM Table_2 
        WHERE Table_2.Code = Table_1.Code 
       ) 
UNION 

SELECT 'missing' AS col_1, Code AS col_2 
    FROM Table_2 
WHERE NOT EXISTS (
        SELECT * 
        FROM Table_1 
        WHERE Table_1.Code = Table_2.Code 
       ); 
Các vấn đề liên quan