2016-12-07 35 views
1

列から特定の4つの値を除いた結果を返すクエリを作成しようとしています。<>を使用して複数の値を除外する

SELECT CustomerID, 
     ContactName, 
     Country 
FROM Customers 
WHERE CustomerID IN (SELECT CustomerID 
         FROM Customers 
         WHERE (Country <> ('UK')('Australia')('Canada'))); 

これは私が1つの国だけが、複数のないを除外した場合に動作します:

は、ここに私のコードです。

お手数ですがお寄せいただきありがとうございます。

答えて

2

使用NOT INオペレータ

リストは、コンマリスト内の各値のためにクローズ/オープン括弧を持つ必要はありませんによって分離されなければなりません。また、あなたはWhere

SELECT CustomerID, 
     ContactName, 
     Country 
FROM Customers 
WHERE Country NOT IN ('USA', 'UK', 'Australia', 'Canada') 

NOT INが存在NULL値がリストにあり

1
Select 
    CustomerID, ContactName, Country 
From Customers 
Where CustomerID NOT IN ('USA','UK','Australia','Canada'); 
1
を失敗したので、あなたは、リスト内の任意の NULL値を渡すいけないことを確認し、フィルタを追加するだけで sub-queryを必要としません。

除外された国を特別なテーブル(例えば、ExcludedCountry)に定義することを検討することができます。これにより、データ(除外された国)がロジックから分離されます(除外された国以外の顧客を選択します)。この場合、クエリは次のように見ることができます:

select CustomerID, ContactName, Country 
from Customers C 
    left join ExcludedCountry EC ON EC.Name = C.CustomerID 
where CustomerID IS NOT NULL 

または

-- may be faster than above 
select CustomerID, ContactName, Country 
from Customers C 
where not exists (
    select 1 
    from ExcludedCountry EC 
    where EC.Name = C.CustomerID) 

このソリューションの利点は、あなたの除外項目の容易な管理です。

+0

2番目の提案方法では1+ ...最初は通常悪化します。 [参考](https://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join)。 –

+0

はい、私は、2番目のクエリがより速いというコメントを付けました。また、実際に差異を見るために項目の数に依存する場合もあります。 – Alexei

関連する問題