sql - 找一个吃过苹果没吃过香蕉的人
问题描述
我想设备一个 SQLite 查询,找出一个人是否person_id
吃过Fruit
'apple'
水果但没有吃过水果'banana'
。我可以访问一个Fruit
表格,其中包含有关谁吃了哪种水果的信息。然后,我想将此信息用于带有子查询但不吃 sSELECT
的人的姓氏。在我看来,它会是这样的:apple
banana
SELECT
P.last_name
FROM
Person AS P
WHERE
P.pid IN (
SELECT
F1.pid
FROM
Fruit AS F1,
Fruit AS F2
WHERE
F1.pid = F2.pid
AND F1.type = 'apple'
AND F2.type <> 'banana'
)
ORDER BY P.pid;
但是,这不是一个足够严格的条件,因为现在我允许与 in 中相同的水果类型F2
,F1
这仍然允许选择该人。另一方面,我不能限制太多,例如
F1.type <> F2.type
SELECT
在子查询中,因为这会将合法人员从ed中踢出。
必须有什么限制才能使这项工作有效?
解决方案
使用聚合:
select p.lastname
from person p
where p.fruit in ('apple', 'banana')
group by p.lastname
having min(p.fruit) = max(p.fruit) and min(p.fruit) = 'apple';
将where
查询限制为仅考虑苹果和香蕉。该having
条款说只有一种水果。. . 那个水果是苹果。
推荐阅读
- javascript - 如何使用类属性正确地创建条件?
- ios - 快速注销后令牌不会变空
- html - 使用 css 打破/包装一个长单词
- python-3.x - 并行运行 Airflow 任务 - 没有任何安排
- android - recyclerview notifyItemInserted notifyItemRemoved 随机行为
- r - 用于 Shiny Dashboard 的 R 编程词云
- c# - C# Unity 序列化 Vector3 类型
- airflow - 在谷歌作曲家中删除 DAG - Airflow UI
- internet-explorer - 带有 IE 的 JAWS 键盘快捷键
- c# - 在 .NET 4.7.2 的 WebForms 中连接 Simple Injector