是否有任何查询
“在....但不在......”?
假设我有一张关于“双重间谍”的表格。
此表格包含姓名,国籍和年龄。
+-------------------------+
| Name Nationality Age |
+-------------------------+
| Jony US 20 |
| Jony China 20 |
| Adam Argentina 25 |
| Lukas China 39 |
| Lukas US 39 |
+-------------------------+
然后我计划为所有具有中国国籍而非美国的代理人输出一份清单。
我写的是什么
从国籍='中国'和国籍的代理商中选择姓名!='美国'
正如预测的那样,它没有打印任何东西,因为它是错误的。
我知道也许这是一个愚蠢的答案,但任何人都可以纠正我吗?谢谢。
答案 0 :(得分:2)
我会使用聚合和having
来完成此操作。我认为最明确的方法是:
select name
from agent
group by name
having sum(nationality = 'China') > 0 and
sum(nationality = 'US') = 0;
肯定有其他方法。这是一个不需要select distinct
或group by
的人:
select a.name
from agent a
where a.nationality = 'China' and
not exists (select 1 from agent a2 where a2.name = a.name and a2.nationality = 'US');
对于agent(nationality, name)
和agent(name, nationality)
上的索引,这可能具有最佳性能。
答案 1 :(得分:0)
你可以这样做
SELECT DISTINCT name
from agent
where nationality = 'China'
and nationality <> 'US';
答案 2 :(得分:0)
您可以使用两个工具来完成这项工作:
distinct
:这可以让你摆脱重复用于过滤掉美国人的子查询。
选择 不同的名字 从 代理人 哪里 国籍='中国' 并不存在( 选择 * 从 代理人 哪里 国籍='美国' )
答案 3 :(得分:0)
如果您要选择位于中国但不是美国的所有座席,您可以在having
select name from mytable
where nationality in ('US', 'China')
group by name
having sum(nationality = 'US') = 0
请注意,在您的示例数据中,所有位于中国的代理商也在美国,因此在这种情况下此查询不会返回任何行。