web-dev-qa-db-fra.com

Comment exclure des enregistrements avec certaines valeurs en SQL

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

10
John Doe
Select col1,col2
From table
Where col1 not in (Select col1 from table where col2 not in (1,20))
12
Mudassir Hasan

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)

1
Alma Do

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)

liveDemo

0
Mari