2012-01-10 110 views
5

我正在設計一個動態SQL查詢,它將檢查目標表的源表。我想比較源的行和目標的行以檢查差異。比較NULL

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

所以我創造了這個說法:

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) 

但只要這隻能作爲COL1的價值觀和COL2不空。 如果table-a col1爲空,而table-b col1爲null,那麼我會認爲它們是相等的。

我知道我可以在我的列周圍放置一個ISNULL,但這是一個動態查詢正在建立,所以我只知道列名不是數據類型。

有什麼建議嗎?

回答

9

您可以使用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

如果(雖然我猜這不太可能是因爲名字)'key'字段是NULL? ON(B.KEY = A.KEY或(A.KEY爲NULL且B.KEY爲NULL))? – MatBailie 2012-01-10 15:36:44

+0

@Dems - 它不是(或者至少這個問題只提到'col1,col2')。 – 2012-01-10 15:37:33

+0

謝謝!完美的作品! – user829237 2012-01-11 09:07:49

2

如何IS NULL?

編輯:更新查詢佔BOT H列,被空......越來越長的又醜,但工作...

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

如果兩個值都是NULL,該怎麼辦? – MatBailie 2012-01-10 15:41:11

+0

良好的捕捉,編輯 – 2012-01-10 15:47:33

0

如果TABLE_A和表-B具有相同的列。你可以試試這個

SELECT * FROM TABLE_A 
EXCEPT 
SELECT * FROM TABLE_B 
+0

這不會做同樣的事情。它需要返回鍵匹配的行,但其他列中的一個不同。這會另外返回'TABLE_A'中的行,而'TABLE_B'中沒有匹配的鍵。 – 2012-01-10 20:01:43

+0

對不起,但表格不具有相同的列..但感謝您的回答 – user829237 2012-01-11 08:33:03