2011-12-05 79 views
0

我試圖在SQL Server 2005中執行篩選操作。從另一個sql server中出現的一個表中篩選行

示例。假設我們有兩個表格Current和Reject。

Current = 1, 2, 3, 4, 5, 1, 2 
Reject = 2, 3, 4 

Current \ Reject = 1, 2, 5 

正如您所看到的,這兩個表共享值。我基本上只是想減去這些共享值並將它們放到一個新表中。

這是我試過的,但沒有奏效。 (A是匹配的列)。

select * from Current left join 
       Reject on csrp.a = rp.a 
     group by Current.a, Reject.a 
     having count(Current.a) > count(Reject.a) 

請注意,元素2被過濾掉了,即使它本來不應該。

enter image description here

馬丁·史密斯的回答工作了這種情況!


編輯

好了,讓我們更加有點複雜。假設我和以前的情況完全相同,除了這次我需要匹配三列而不是一列嗎?

Current = (1, 2, 3), (2, 3, 4), (2, 3, 4), (4, 5, 6), (7, 8, 9), (1, 2, 3) 
Reject = (2, 3, 4), (4, 5, 6), (7, 8, 9) 

Current \ Reject = (1, 2, 3), (2, 3, 4) 
+0

是的,這是正確的。元素2在Current中出現兩次,但在Reject中只出現一次。所以我想讓元素2出現在我的結果中。那有意義嗎? –

回答

1
WITH [Current](a, b, c) 
    AS (SELECT 1, 2, 3 UNION ALL 
     SELECT 2, 3, 4 UNION ALL 
     SELECT 2, 3, 4 UNION ALL 
     SELECT 4, 5, 6 UNION ALL 
     SELECT 7, 8, 9 UNION ALL 
     SELECT 1, 2, 3), 
    Reject(a, b, c) 
    AS (SELECT 2, 3, 4 UNION ALL 
     SELECT 4, 5, 6 UNION ALL 
     SELECT 7, 8, 9), 
    T(RN, a, b, c) 
    AS (SELECT ROW_NUMBER() OVER (PARTITION BY a, b, c ORDER BY (SELECT 0)), 
       a, 
       b, 
       c 
     FROM [Current] 
     EXCEPT 
     SELECT ROW_NUMBER() OVER (PARTITION BY a, b, c ORDER BY (SELECT 0)), 
       a, 
       b, 
       c 
     FROM Reject) 
SELECT DISTINCT a, 
       b, 
       c 
FROM T 
+0

這就是說ROW_NUMBER()需要一個ORDER BY子句。 –

+0

@TommyFisk - 請參閱編輯。 –

+0

好吧,所以我知道我沒有問這個問題,但假設我需要根據另外兩列進行過濾,比如B和C.我只需要PARTITION BY a,b,c然後選擇它們? –

相關問題