SQL 仅显示同时包含这两项的结果



我有一个SQL表,上面有人们吃的名字和水果。 我只希望结果显示同时吃苹果和香蕉的人的名字。但是,如果我使用"其中项目='香蕉'和项目='苹果',数据什么也没显示。 如果我使用:where item in('banana','apple'),它显示的结果如表所示。

>Name Item
约翰· 苹果
大卫 ·香蕉
约翰· 香蕉

我们可以做一个 GROUP BY,然后从列表中选择只吃了 2 种水果的人,即他们两个

CREATE TABLE eaten(
person VARCHAR (10),
fruit VARCHAR (10));
INSERT INTO eaten VALUES
('John','apple'),
('Bill','apple'),
('Bill','pear'),
('David','banana'),
('David','banana'),
('John','banana');
SELECT person
FROM eaten
WHERE fruit IN ('apple','banana')
GROUP BY person
HAVING COUNT(DISTINCT fruit) =2;
|
人 | |:----- | |约翰 |

db<>小提琴在这里

WITH CTE_Apple AS 
(
SELECT * FROM Table where Item = 'Apple'
)
,
CTE_Banana AS 
(
SELECT * FROM Table WHERE Item = 'Banana'
)
SELECT 
A.Name 
FROM 
CTE_Apple AS A
JOIN
CTE_Banana AS B ON B.Name = A.Name

基本上创建数据的两个子集,并在数据相交的地方将它们连接在一起。 还有很多其他方法可以做到这一点,但我发现 CTE(通用表表达式)是最优雅的

使用子查询应该可以在任何RDBMS中使用:

select distinct Name 
from table_name
where Item = 'Apple'
and Name in 
(select Name from table_name where Item = 'Banana');

您可以将DISTINCTEXISTS子句一起使用来获取所需的内容。

SELECT DISTINCT name
FROM table1 a
WHERE a.Item = 'Apple'
AND EXISTS (SELECT *
FROM table1 b
WHERE b.Item = 'Banana'
AND b.Name = a.Name)

最新更新