2011-10-23 8 views
-1

別のテーブルにある2つのカラムに基づいてデータを除外する必要があります。レコードを除外する

表1には、2つの列aとbがあります。 表2には、3つの列a、b、cがあります。列BとCは範囲を表します。一部のレコードでは範囲がありません。例を以下に示します。

表2のデータ、我々は表2のデータに基づいて、表1からレコードを除外する必要が

Column A Column B Column C 
1   1   10 
2   5   NULL 
2   8   NULL 
2   25   50 
3   10   100 
4   7   10 
4   2   NULL 

。 table1.column A = table2.column Aとtabl2.column bとtable2.columnとの間のテーブル1.column b。c。

表1には数百のレコードがありますが、table1データからtable2データを除外する必要があります。以下の表1のデータを表1に示す。私たちはテーブルから2

を第一のレコードと5のレコードを除外する必要が

ColumnA Column B 
1  4 
1  14 
1  15 
2  1 
2  5 

できるだけ早くこの問題を解決するために私を助けてください?

+4

ヘルプの依頼「できるだけ早く」は一般にSOに反対の効果をもたらします。 – Tony

+0

'Table2.ColumnC'に' NULL'は何を表していますか?上限はありませんか? 'ColumnB'(下限なし)にも同じことが適用されますか? – Phil

+0

@トニー: "ALAP"を考える時間;-) – zerkms

答えて

1

Iは、それぞれ、Table2Column B又はColumn CいずれかにNULL無し下又は上限範囲を表すと仮定していません。

が、この質問から行方不明に必要な情報の多くは、有能私は、フロントアップ私の仮定をリストアップしますので、それに答えるためにあり、この

SELECT ColumnA, ColumnB 
FROM Table1 
WHERE NOT EXISTS (
    SELECT 1 FROM Table2 
    WHERE Table1.ColumnA = Table2.ColumnA 
    AND ((
     Table2.ColumnC IS NULL 
     AND Table1.ColumnB >= Table2.ColumnB 
    ) OR (
     Table2.ColumnB IS NULL 
     AND Table1.ColumnB <= Table2.ColumnC 
    ) OR (
     Table1.ColumnB BETWEEN Table2.ColumnB AND Table2.ColumnC 
    )) 
) 
1

を試してみてください。将来、使用しているSQLベンダーを追加すると、データの意味が人々の手助けとなります。

私はMSSQL 2008 R2を使用しているとします。表2のデータは、表1の値が入ることを許されない一連の除外範囲を表し、列Cは、その範囲が開放型であることを意味する。

あなたの質問に対する答えは、ジョインの使用によって最も簡単に答えられると言われています。これが新しいコンセプトの場合は、リレーショナルDB http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.htmlのジョインと、特定のRDBMSのJOINドキュメントを参照してください。

MSSQLでは、次のような何かをすることによってこれを実現します:

With ValuesInRange 
AS 
(
    Select distinct ColumnA, ColumnB from Table1 
    Join Table2 on Table1.A = Table2.A 
    AND Table1.ColumnB >= Table2.ColumnA 
    AND Table1.ColumnB <= isnull(Table2.ColumnC, Table1.ColumnB) 
) 
Select * from Table1 a 
OUTER Join ValuesInRange b 
ON a.ColumnA = b.ColumnA AND a.ColumnB = b.ColumnB 
Where b.ColumnA IS NULL 

あなたはすべての行のクエリを再発行する必要が避けて、わずかに良いパフォーマンスを取得する必要がありCTEを使用することにより。これはあまり差をつけすぎてはいけませんが、数百行しかありません。

+0

これに感謝します。別の理由(No Nulls)のためにレコードを除外する必要があり、あなたの答えが私のために働くかもしれないと思います。私は古いSELECT * FROM TABLEを避けようとしていましたが、FIELD NOT IN(SELECT FIELD FROM TABLE) – DataGirl

関連する問題