Comment exclure des enregistrements avec certaines valeurs en SQL (MySQL)
Col1 Col2
----- -----
A 1
A 20
B 1
C 20
C 1
C 88
D 1
D 20
D 3
D 1000
E 19
E 1
Renvoie Col1 (et Col2), mais uniquement si la valeur dans Col2 est 1 ou 20, mais pas s'il existe également une autre valeur (autre que 1 ou 20)
Résultat désiré:
Col1 Col2
----- -----
A 1
A 20
B 1
Mais pas C, D et E car il y a une valeur dans Col2 autre que 1 ou 20
J'ai utilisé des valeurs fictives pour Col2 et seulement deux valeurs (1 et 20) mais en réalité, il y en a encore plus.
Je peux utiliser IN ('1', '20') pour les valeurs 1 et 20 mais comment exclure s’il existe également une autre valeur dans Col2. (il n'y a pas de gamme!)
Select col1,col2
From table
Where col1 not in (Select col1 from table where col2 not in (1,20))
Utilisez SUM()
SELECT
*
FROM
t
INNER JOIN
(SELECT
SUM(IF(Col2 IN (1, 20), 1, -1)) AS ranges,
col1
FROM
t
GROUP BY
col1
HAVING
ranges=2) as counts
ON counts.col1=t.col1
Update : bien que cela fonctionne pour une liste non répétée, il peut en résulter un ensemble incorrect pour la table avec des valeurs répétées (c.-à-d. 1
, 20
, 20
, 1
dans la colonne. vous n'avez pas mentionné cela). Dans le cas de répétitions, où est aussi un moyen:
SELECT
t.*
FROM
t
INNER JOIN
(SELECT
col1,
col2
FROM
t
GROUP BY
col1
HAVING
COUNT(DISTINCT col2)=2
AND
col2 IN (1, 20)) AS counts
ON test.col1=counts.col1
(et cela fonctionnera dans le cas commun aussi, bien sûr)
Vous pouvez faire la même chose avec la clause NOT EXISTS
également,
Select A.COL1,A.COL2
From MYTABLE A
where NOT EXISTS
(Select COL1 from MYTABLE B where A.COL1=B.COL1 and
COL2 NOT IN (1,20)
GROUP BY COL1)