2012-01-10 43 views
5

Tôi đang thiết kế một truy vấn SQL động sẽ kiểm tra một bảng nguồn dựa vào bảng đích. Tôi muốn so sánh các hàng của nguồn với các hàng của mục tiêu để kiểm tra sự khác biệt.So sánh các số NULL

CREATE TABLE TABLE_A (KEY INT, COL1 INT, COL2 INT) 
CREATE TABLE TABLE_B (KEY INT, COL1 INT, COL2 INT) 

Vì vậy, tôi đã tạo ra tuyên bố này:

SELECT A.* FROM TABLE_A A 
INNER JOIN TABLE_B B 
ON B.KEY = A.KEY 
AND (B.COL1<>A.COL1 OR B.COL2<>A.COL2) 

Nhưng điều này chỉ hoạt động chừng nào các giá trị của col1 và col2 không null. Nếu table-a col1 là null và table-b col1 là null thì tôi sẽ cân nhắc chúng bằng nhau.

Tôi biết tôi có thể đặt ISNULL quanh các cột của tôi, nhưng đây là truy vấn động đang được xây dựng, vì vậy tôi chỉ biết tên cột không phải là kiểu dữ liệu.

Mọi đề xuất?

Trả lời

9

Bạn có thể sử dụng this approach

SELECT A.* 
FROM TABLE_A A 
INNER JOIN TABLE_B B 
ON B.KEY = A.KEY 
WHERE NOT EXISTS (SELECT A.* 
        INTERSECT 
        SELECT B.*) 
+0

Điều gì sẽ xảy ra nếu (mặc dù tôi cho rằng điều này không thể xảy ra với tên) trường 'khóa' là NULL? 'ON (B.KEY = A.KEY OR (A.KEY IS NULL và B.KEY IS NULL))'? – MatBailie

+0

@Dems - Không phải (hoặc ít nhất là câu hỏi chỉ đề cập đến 'col1, col2'). –

+0

Cảm ơn! Hoạt động hoàn hảo! – user829237

2

Làm thế nào về IS NULL?

Edit: Cập nhật truy vấn để giải thích cho cột bot h là null ... nhận được dài và xấu xí, nhưng làm việc ...

SELECT A.* FROM TABLE_A A 
INNER JOIN TABLE_B B 
ON B.KEY = A.KEY 
AND ((B.COL1<>A.COL1 OR (A.COL1 IS NULL AND B.col1 IS NOT NULL) OR (B.COL1 IS NULL AND A.col1 IS NOT NULL)) 
OR (B.COL2<>A.COL2 OR (A.COL2 IS NULL AND B.col2 IS NOT NULL) OR (B.COL2 IS NULL AND A.col2 IS NOT NULL))) 
+0

Nếu cả hai giá trị là NULL thì sao? – MatBailie

+0

Tốt bắt, chỉnh sửa –

0

Nếu TABLE_A và table_b có cột giống nhau. Bạn có thể thử điều này

SELECT * FROM TABLE_A 
EXCEPT 
SELECT * FROM TABLE_B 
+0

Điều đó không làm điều tương tự. Nó cần trả về các hàng mà các phím khớp với nhau nhưng một trong các cột khác thì khác nhau. Điều này sẽ bổ sung trả lại các hàng trong 'TABLE_A' không có khóa khớp trong' TABLE_B' –

+0

Xin lỗi nhưng các bảng không có cùng các cột .. Nhưng cảm ơn câu trả lời của bạn – user829237