J'ai une table comme celle-ci:
|__ID__| | 1 |
J'essaye de créer une requête qui vérifie quels ID manquent la clé BB.
Donc dans l'exemple ci-dessus, je me retrouverais avec le résultat
|__ID__|__Key__|__Value__| | 1 | AA | 2 | | 2 | AA | 2 | | 2 | BB | 2 | | 2 | CC | 2 | | 3 | BB | 2 | | 3 | AA | 2 |
J'ai essayé de rechercher des questions similaires ici sur StackOVerflow et d'autres sites mais je me retrouve toujours avec le résultat répertoriant tous Lignes d'ID qui n'ont pas la clé BB. Dans l'exemple ci-dessus, j'aurais 1,2,2,3.
3 Réponses :
Vous devez filtrer votre ensemble de données en fonction des valeurs qui ne sont pas dans votre ensemble de données, ce qui est généralement mieux fait en utilisant un n'existe pas :
+----+ | id | +----+ | 1 | +----+
Le problème avec cela est qu'il existe de nombreuses valeurs clés différentes. Donc, ce que j'ai essayé de créer est une requête où elle regroupe les mêmes identifiants numériques et vérifie si la clé BB n'existe pas dans ce tableau.
@LasseSolberg Désolé, mais votre commentaire n'a pas de sens pour moi ... Voulez-vous dire que vous filtrez sur de nombreuses valeurs clés différentes et pas seulement sur BB ?
@iamdave essayez votre solution avec ce jeu de données valeurs (1, 'BB', 2), (2, 'BB', 2), (4, 'BB', 2), (1, 'AA', 2 ), (2, 'AA', 2); , il ne retournera rien
@VasilyIvoyzha Ma requête ne renvoie aucun résultat, car toutes les valeurs id ont une clé BB ?
@LasseSolberg Avez-vous réellement essayé ma requête? Je vous garantis que cela vous donnera les bons résultats.
Je pense que Vasily Ivoyzha est confus sur l'exigence du PO @iamdave. UIa gree cela fonctionnerait exactement comme le PO l'a demandé.
@iamdave Je veux dire qu'il y a près d'une centaine de valeurs clés différentes dans le tableau.
@LasseSolberg Ce n'est pas un problème. Essayez ma requête sur vos données et voyez comment ça se passe.
Comme je l'ai dit dans les commentaires, j'utiliserais personnellement HAVING:
SELECT ID FROM YourTable GROUP BY ID HAVING COUNT(CASE WHEN [Key] = 'BB' THEN 1 END) = 0;
DB violon pour la personne qui pense que cela ne fonctionne pas.
Fonctionne comme un charme! merci :) Je n'ai pas voté contre, j'essaie de voter mais je reçois ce message "Merci pour les commentaires! Les votes exprimés par ceux qui ont moins de 15 points de réputation sont enregistrés, mais ne modifiez pas le score affiché publiquement."
De rien, @LasseSolberg. J'aimerais juste savoir comment je pourrais "améliorer" la question davantage pour plaire à l'électeur défavorable. Si vous ne comprenez pas la réponse, veuillez demander, cependant, j'espère j'espère que celle-ci est assez explicite, :)
@Larnu essayez votre solution avec ce jeu de données valeurs (1, 'BB', 2), (2, 'BB', 2), (4, 'BB', 2), (1, 'AA', 2 ), (2, 'AA', 2); , il ne retournera rien
D'après la description donnée par l'OP, pour cet ensemble de données, il ne devrait rien renvoyer. Les ID 1, 2 et 4 tous ont la clé avec la valeur BB . Le PO a même déclaré que cela répond à leur question. Je ne pense pas que vous ayez compris la demande du PO.
@VasilyIvoyzha votre ensemble de données n'a pas d'ID 3 ... Une ligne ne peut pas être renvoyée pour une valeur qui n'existe pas. L'OP ne demande pas d'identifier les valeurs d'ID «manquantes», il cherche à renvoyer des ID qui n'ont pas la valeur 'BB' pour clé
Modifiez votre jeu de données en valeurs (1, 'BB', 2), (2, 'BB', 2), (4, 'BB', 2), (1, 'AA', 2), ( 2, «AA», 2), (3, «AA», 4) ; et vous aurez 3 renvoyé, @VasilyIvoyzha.
Vous pouvez y parvenir de plusieurs manières. L'un d'eux consiste à sélectionner les ID qui ont la clé BB, ce qui est facile, puis à soustraire cela de l'ensemble complet des ID:
SELECT DISTINCT ID FROM Table1 WHERE ID NOT IN (SELECT ID FROM Table1 WHERE [Key] = 'BB')
Voici SQLFiddle montrant la solution ci-dessus: http://www.sqlfiddle.com/#!18/47db9/6
D'autres moyens de résoudre peuvent être trouvés dans cette question SO: SQL: Comment sélectionner uniquement les groupes qui ne contiennent pas une certaine valeur?
Pour rechercher ce dont vous avez besoin, essayez de former votre question comme: "comment sélectionner des groupes qui ne contiennent pas un certain élément" car en principe vous voulez regrouper les éléments par id et récupérer uniquement certains groupes même si nous n'avons pas utilisé une instruction GROUP BY pour le résoudre
p >
Qu'est-ce que tu as essayé jusque-là? Avez-vous jeté un œil à
NOT EXISTSouHAVINGavec un agrégat conditionnel? (Personnellement, comme vous n'avez besoin que de l 'ID, j'irais avecHAVING.)J'ai essayé à la fois NOT EXISTS et HAVING, mais je n'arrive pas à le faire fonctionner. Je sais que j'ai besoin de plus de pratique pour créer des requêtes: D Et vous avez raison. Je n'ai besoin que de l'ID pour le résultat.