在SQL中组合WHERE EXISTS和IN

问题描述 投票:0回答:6

考虑表中有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')
);

这导致显示所有名称。我无法解决它。你能帮忙理解吗?

sql db2 exists relational-division
6个回答
1
投票

使用聚合

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
            );

1
投票

你可以像下面这样使用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'

1
投票

您可以在桌面上做一个简单的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 xy


1
投票

您可以像这样使用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行。


0
投票

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);

0
投票

您需要的关系运算符称为divide a.k.a.供应所有部件的供应商。

SQL没有除法运算符,因此您必须自己滚动,具体取决于您是否需要精确值或余数等。

但是如果你只有两个硬编码值,那么你可以让事情变得更简单:

SELECT NAME FROM SAMPLE WHERE SPECIALITY IN = 'X'
INTERSECT
SELECT NAME FROM SAMPLE WHERE SPECIALITY IN = 'Y'
© www.soinside.com 2019 - 2024. All rights reserved.