1
votes

Comment exclure plusieurs lignes par une correspondance

Eh bien, désolé mais je ne sais pas comment formuler correctement le sujet. C'est pourquoi je ferais mieux de décrire le problème.

J'ai une sorte de tableau suivant:

select t1.Name, t1.v1
from `Test` as t1
join (
  select Name from `Test`
  where v1 = 7
  ) as t2
  on t1.Name != t2.Name

Ce dont j'ai besoin est de trouver tous les noms qui correspondent par exemple à 7. Ce sont 'C' , 'D' et 'G' .

Et maintenant, je dois sélectionner toutes les lignes sauf 'C' , 'D' et 'G' .
La table résultante est censée être:

===============
| Name  | v1  |
|–––––––––––––|
|   A   |  4  |
|   A   |  3  |
|   B   |  6  |
|   E   |  3  |
|   F   |  1  |
|   F   |  2  |
|   H   |  9  |
|   H   |  1  |
|   I   |  5  |
|–––––––––––––|

J'ai essayé la requête:

CREATE TABLE IF NOT EXISTS `Test` (
  `Id` INT NOT NULL AUTO_INCREMENT,
  `Name` VARCHAR(5) NOT NULL,
  `v1` INT NOT NULL,
  PRIMARY KEY (`Id`)
);

INSERT INTO `Test` (`Name`, `v1`) 
  VALUES ('A', 4), ('A', 3), ('B', 6), ('C', 1), ('C', 2), 
         ('C', 7), ('D', 7), ('D', 5), ('E', 3), ('F', 1), 
         ('F', 2), ('G', 7), ('H', 9), ('H', 1), ('I', 5);

mais je me suis seulement rendu compte que je ne comprenais toujours pas la mécanique des instructions JOIN .

J'espère de l'aide avec ce problème.
Merci d'avance.


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser not exists :

select t.*
from test t
where not exists (select 1
                  from test t2
                  where t2.name = t.name and t2.v1 = 7
                 );

Ceci sélectionne toutes les lignes du test où le nom de la ligne n'a pas de ligne avec 7 , n'importe où dans le tableau.


0 commentaires

1
votes

Voici comment procéder avec les JOINs ...

SELECT x.* 
  FROM test x 
  LEFT 
  JOIN test y 
    ON y.name = x.name 
   AND y.v1 = 7 
 WHERE y.id IS NULL;
+----+------+----+
| Id | Name | v1 |
+----+------+----+
|  1 | A    |  4 |
|  2 | A    |  3 |
|  3 | B    |  6 |
|  9 | E    |  3 |
| 10 | F    |  1 |
| 11 | F    |  2 |
| 13 | H    |  9 |
| 14 | H    |  1 |
| 15 | I    |  5 |
+----+------+----+


0 commentaires

1
votes

Cette requête:

> Id | Name | v1
> -: | :--- | -:
>  1 | A    |  4
>  2 | A    |  3
>  3 | B    |  6
>  9 | E    |  3
> 10 | F    |  1
> 11 | F    |  2
> 13 | H    |  9
> 14 | H    |  1
> 15 | I    |  5

renvoie tous les Name que vous souhaitez exclure.
Utilisez-le avec l'opérateur NOT IN :

SELECT * 
FROM Test
WHERE Name NOT IN (SELECT Name FROM Test WHERE v1 = 7)

Voir la démo .
Résultats:

SELECT Name FROM Test WHERE v1 = 7


0 commentaires