2016-12-07 87 views
1

排除多个值我试图创建一个查询,返回排除列中4个特定值的结果。使用<>

这里是我的代码:

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

这工作,如果我排除只有一个国家,但不是多。

在此先感谢您提供的任何帮助。

回答

2

使用NOT IN操作

名单应以逗号没有必要有开/关括号的列表中的每个值分开。你也不必sub-query刚才添加的过滤器Where条款

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

确保你不传递任何NULL值列表内,因为NOT IN失败时有出现在列表

1
Select 
    CustomerID, ContactName, Country 
From Customers 
Where CustomerID NOT IN ('USA','UK','Australia','Canada'); 
1
一个 NULL

您可以考虑在特殊表格中定义排除的国家(例如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

1+为第二个建议的方式...第一个通常表现更差。 [参考文献](https://sqlperformance.com/2012/12/t-sql-queries/left-anti-semi-join)。 –

+0

是的,这是我说第二个查询可能会更快的评论。它也可能取决于项目的数量来真正看到差异。 – Alexei

相关问题