我有一个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');
您可以将DISTINCT
与EXISTS
子句一起使用来获取所需的内容。
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)