我需要帮助改进下表中查询的WHERE子句:
Key | Name | Role | Location
111 | Bob | Manager | All Locations
222 | Jim | Manager | All Locations
333 | Tim | Sales | Washington
444 | Roy | Sales | New York
555 | Lee | Sales | All Locations
666 | Gus | Sales | All Locations
777 | Joe | Admin | All Locations
888 | Jen | Admin | New York
我需要排除所有“所有位置”记录,但保留“所有位置”记录,其中“角色”是“管理员”。为了获得理想的结果:
Key | Name | Role | Location
111 | Bob | Manager | All Locations
222 | Jim | Manager | All Locations
333 | Tim | Sales | Washington
444 | Roy | Sales | New York
888 | Jen | Admin | New York
我认为下面的查询将排除所有所有位置记录,包括经理记录。
SELECT * FROM Table
WHERE (Location <> 'All Locations' AND Role <> 'Manager')
答案 0 :(得分:4)
您需要展开{{1}}:
WHERE
返回结果:
select *
from yourtable
where
(
role = 'Manager'
and location = 'All Locations'
)
or
(
location <> 'All Locations'
)
答案 1 :(得分:1)
SELECT * FROM Table
WHERE (Location != 'All Locations' OR (Location = 'All Locations' AND Role = 'Manager')
答案 2 :(得分:1)
您说“排除所有'所有位置'的记录,但保留”所有位置“记录,其中”角色“是”管理员“。这是否意味着 排除 所有位置记录,其中角色是 不是 经理?即,你不想要包括记录111和222 ??
根据De Morgans Law,Not A And Not B等同于Not(A或B)
在你的情况下,一个谓词是正面的而另一个是否定的,所以De Morgan会读到:
Not (A And not B) <=> (Not A or B), i.e.,
这意味着 包含 所有非Not All Locations或Manager的记录。
如果是,那么你需要的是:
... Where Location != 'All Locations' Or Role = 'Manager'
答案 3 :(得分:0)
您应该使用OR而不是AND
SELECT * FROM Table
WHERE (Location <> 'All Locations' OR Role = 'Manager')