2011-12-05 9 views
0

SQL Server 2005でフィルタ処理を実行しようとしています。別のSQLサーバーに表示される1つのテーブルの行をフィルタする

例。 CurrentとRejectの2つのテーブルがあるとしましょう。

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

Current \ Reject = 1, 2, 5 

ご覧のとおり、2つのテーブルは値を共有しています。基本的には、それらの共有された値を減算して新しいテーブルに配置したいだけです。

これは私が試したものですが、動作しませんでした。 (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

マーティン・スミスの答えは、このような場合のために働いていました!


EDIT

[OK]を、それでは、もう少しそれを複雑にしてみましょう。前回と全く同じ状況があるとしましょう。今回は、1つではなく3つの列に合わせる必要があります。

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に2回表示されますが、Rejectでは1回だけ表示されます。だから私は要素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のようにさらに2つの列に基づいてフィルタを適用する必要があるとしましょう。a、b、cを区切り、 ? –

関連する問題