考虑表中有n行,带有NAME和专业。
NAME SPECIALITY
AA X
AA Y
BB X
CC X
CC Y
CC Z
我需要名字,其专长包括X和Y.因此,我应该得到AA和CC。我遇到过哪里存在,但我还没有确定它的框架:
SELECT DISTINCT NAME
FROM SAMPLE
WHERE EXISTS (
SELECT SPECIALITY
FROM SAMPLE
WHERE SPECIALITY IN ('X','Y')
);
这导致显示所有名称。我无法解决它。你能帮忙理解吗?
使用聚合
select name
from tab
where SPECIALITY in ('X','Y')
group by name
having count(distinct SPECIALITY)=2
在您的查询中,我可以编辑如下
SELECT DISTINCT NAME
FROM SAMPLE t1
WHERE EXISTS (SELECT SPECIALITY FROM
SAMPLE t2
WHERE SPECIALITY IN ('X','Y') and
t1.NAME=t2.NAME
having count(distinct SPECIALITY)=2
);
你可以像下面这样使用self join
:
select distinct t1.NAME from SAMPLE t1 join SAMPLE t2
on t1.NAME = t2.NAME
and t1.SPECIALITY = 'X' and t2.SPECIALITY = 'Y'
您可以在桌面上做一个简单的self
join
,以获得所需的输出,如下所示。
SELECT t1.NAME
FROM yourtable t1
INNER JOIN yourtable t2
ON t1.NAME = t2.NAME
WHERE t1.speciality = 'x'
AND t2.speciality = 'y'
上面的查询将显示所有names
同时具有speciality
x
和y
。
您可以像这样使用EXISTS
:
SELECT name
FROM sample AS tx
WHERE speciality = 'x'
AND EXISTS (
SELECT 1
FROM sample AS ty
WHERE ty.name = tx.name
AND ty.speciality = 'y'
)
它将找到所有x
行,其中存在y
行。
EXISTS
版本需要两个EXISTS
:
SELECT S.*
FROM SAMPLE S
WHERE EXISTS (SELECT 1 FROM SAMPLE S1 WHERE S.NAME = S1.NAME AND S1.SPECIALITY = 'X') AND
EXISTS (SELECT 1 FROM SAMPLE S1 WHERE S.NAME = S1.NAME AND S1.SPECIALITY = 'Y');
但是,简单聚合也应该起作用:
SELECT S.NAME
FROM SAMPLE S
WHERE SPECIALITY IN ('X', 'Y')
GROUP BY NAME
HAVING MIN(SPECIALITY) <> MAX(SPECIALITY);
您需要的关系运算符称为divide a.k.a.供应所有部件的供应商。
SQL没有除法运算符,因此您必须自己滚动,具体取决于您是否需要精确值或余数等。
但是如果你只有两个硬编码值,那么你可以让事情变得更简单:
SELECT NAME FROM SAMPLE WHERE SPECIALITY IN = 'X'
INTERSECT
SELECT NAME FROM SAMPLE WHERE SPECIALITY IN = 'Y'