Est-il un “NON” de la syntaxe comme “OÙ XXX qui ne sont PAS”?
- J'ai un peu de requêtes obtenir les numéros d'identification de lignes qui seront supprimés dans l'avenir.
- Les numéros de ligne sont mis dans une chaîne de caractères et placé dans la requête ci-dessous (si vous voyez "2").
- Je veux les résultats d'ignorer les lignes (comme si ils ont déjà été supprimés).
SELECT MAX(T1.id) AS MAXid FROM transactions AS T1 WHERE id NOT IN ( 2 ) GROUP BY T1.position ORDER BY T1.position
Ma conjecture est que j'ai besoin de remplacer le "OÙ", avec "AVOIR", mais je ne trouve pas de "ne PAS AVOIR" de la syntaxe.
La façon dont cette question est actuellement à l'écrit, il ne reviendra pas une ligne pour T1.la position du max id pour la position est répertorié dans la clause where.
Comment puis-je obtenir cette requête de me donner le max ID pour le T1.position
tout en donnant sur les lignes avec des Id énumérés dans la clause where?
Vous ne pouvez pas simplement "remplacer la
WHERE
avec HAVING
". Le HAVING
clause doit apparaître dans un endroit différent de la requête après la GROUP BY
et ORDER BY
. MAIS - comme titanoboa dit, je ne suis pas sûr HAVING
est ce que vous cherchez. Donc je vote pour lui!OriginalL'auteur Drewneedshelp | 2011-03-09
Vous devez vous connecter pour publier un commentaire.
HAVING id NOT IN (2)
devrait fonctionner;[NOT] IN
n'est pas limitée àWHERE
clauses.Remplaçant au avec AVOIR ne fonctionne pas, car après AVOIR ne peut pas se produire avant le GROUPE.
Drewneedshelp - Vous obtenu l'erreur, parce que vous mettez les AVOIR avant le GROUP BY et ORDER BY. Il devrait être à la fin de la requête.
dans mon cas,
having
clause doit être placé entreGROUP BY
etORDER BY
pour les faire fonctionner.OriginalL'auteur geekosaur
AVOIR n'est pas ce que vous avez besoin - il n'est utile que si vous souhaitez filtrer par MAX. Par exemple, si vous ne voulez pas d'obtenir tous les MAXids mais seulement ceux de plus de 2, vous pouvez utiliser AVOIR MAXid > 2.
Comme je le comprends, vous voulez ignorer certaines lignes et de calculer la MAXid les lignes restantes. À cette fin, votre déclaration semble correct pour moi. Afaics une position n'est pas répertorié dans le jeu de résultats si tous ses identifiants sont mentionnés dans vos PAS DANS la clause. C'est raisonnable, puisqu'il n'y a rien à gauche, vous pouvez calculer un MAX de. Si certains d'une position à l'ids sont répertoriés dans PAS dans, tandis que d'autres sont pas, vous devriez obtenir le MAX de celles ne figurant pas dans PAS dans.
Si vos résultats ne correspondent pas à ces expactations, vous devez déboguer la chaîne que vous insérez dans le PAS - peut-être accidentellement contient trop d'id.
Je suis d'accord avec votre réponse de 100%, ce qui est pourquoi j'ai écrit la requête de cette façon. Cependant, je ne reçois pas le comportement attendu. Au lieu de cela, il [omet toute position où le MAXid est dans la PAS dans.] Votre suggestion "debug de la chaîne que vous insérez dans le PAS - peut-être accidentellement contient trop d'id." ne s'applique pas ici. La requête réelle (que je suis en cours d'exécution pour mon test unitaire) est, comme vu ci-dessus (avec un seul id de l'omettre). Remarque: Le T1.la position n'ont une autre ligne (avec l'id=1) que je suis l'espoir d'obtenir dans le jeu de résultats.
OriginalL'auteur titanoboa
Syntaxe valide pour l'AVOIR, c'est comme cela
Ma réponse est juste la syntaxe pour l'AVOIR. Je ne suis pas de l'interprétation de la question, qui n'est pas tout à fait clair. Dans votre exemple, l'OP peut se poser, car le max(id) de 2 est déjà marqué pour la suppression, de ne pas en ajouter un autre, max(id) de 1.
titanoboa comprend ce que j'essaie de faire clairement. Je suis d'accord avec sa réponse (qui prend en charge ma requête d'origine), mais je n'obtiens pas le comportement attendu.
Si vous n'obtenez pas le comportement attendu, votre requête est fausse. DANS(2), Si les valeurs d'id pour un poste sont 0, 1, 2 et vous souhaitez id 1 pour être sélectionné, utilisez votre requête, qui a la syntaxe correcte. Si vous ne voulez pas d'id 1 ensuite, utilisez la requête avec AVOIR.
Je suis d'accord que ma syntaxe est OK. J'obtiens le résultat "1. Obtenez toutes les max Id 2. Puis exclure ceux qui sont dans la PAS dans" la. Nous l'espérons, à vous de voir comment c'est "correct". Ce que je veux, c'est "1. Omettre toutes les id dans PAS dans. 2. Obtenir le max Id pour chaque poste". Les deux concepts ne sont pas les mêmes. J'ai réussi à écrit la requête de l'ancien concept. Ma question est "Comment puis-je écrire la requête pour le dernier concept?"
OriginalL'auteur fredt
a u essayer avec
si on est seul numéro, alors pas besoin d'ajouter
'
, de nombreux noms sont là, puis utiliser'
comme'2','3'
TOUT s'attend à une sous-requête, qui est la raison de l'erreur de syntaxe. Et si vous souhaitez utiliser une sous-requête, vous voudrez probablement utiliser <> au lieu de <> TOUT. <> TOUT vérifie si il y a au moins une entrée dans le jeu de résultats de la sous-requête qui est différent de l'id qui n'est pas logique pour votre cas d'utilisation.
n'requête ci-dessus fonctionne avec
<>ALL
Il devrait travailler avec les <> si vous utilisez une sous-requête comme where id <> TOUS (SÉLECTIONNEZ " 2 " DE transactions), mais je ne vois pas de gain par rapport à PAS DANS.
OriginalL'auteur diEcho