Je vois une requête comme quel est le truc sur peut-il expliquer ? p> EDIT: Quelles sont les zones d'utilisation communes? p> p> ayant compter (*)% 2 = 1 code> p>
8 Réponses :
ne vérifierait-il pas si vous avez un nombre impair d'entrées par étape? p>
Well% est l'opérateur modulo, qui donne le reste d'une division afin qu'il donnerait 0 lorsque le numéro est exactement divisible par 2 (même) et 1 lorsque non (par exemple, il est étrange). La requête sélectionne donc essentiellement des éléments pour lesquels le nombre est impair (comme indiqué ci-dessus). P>
ok je comprends ce qui est l'opérateur de module. Mais je ne demande pas ça! Quelle est l'astuce, pourquoi un programmeur utilise cette déclaration, quel est le modèle derrière cela? etc.
L'astuce consiste à sélectionner tous les autres éléments (spécifiquement) - c'est un simple comme ça. Si vous voulez en savoir plus sur pourquoi ils le font, cela dépend probablement du contexte (par exemple, que sélectionnent-ils exactement?).
Disons que vous souhaitez séparer les entrées étranges et même en deux colonnes. Vous pouvez utiliser le même pour l'un d'entre eux et l'impair pour l'autre. est-ce que cela aide?
Il retournera toutes les étapes qui avaient un nombre impair de lignes. p>
Le comte (*) comptera toutes les lignes de la base de données. Le% est le caractère du module, qui vous donnera le reste d'un problème de division. Donc, cela divise toutes les lignes par deux et renvoie ceux qui ont un reste de 1 (signifiant un nombre impair de lignes.) P>
Comme Erik a souligné, cela ne serait pas toutes les lignes, mais plutôt ceux groupés par étape, ce qui signifie que c'est toutes les lignes étranges par étape. P>
Il comptera les lignes, regroupées par étape.
Merci, je n'ai pas remarqué le groupe par étape.
une raison de faire ceci: p>
Disons que vous souhaitez séparer les entrées étranges et pair dans deux colonnes. Vous pouvez utiliser le même pour l'un d'entre eux et l'impair pour l'autre. P>
Je l'ai également mis dans un commentaire mais ne recevait pas de réponse. P>
Il est impossible pour nous de répondre à votre question sans savoir quelles sont utilisées les tables. P>
Pour une "étape" donnée, il serait peut-être nécessaire de disposer d'une quantité égale de "quelque chose" et que cela produira une liste d'éléments à afficher dans une interface où ce n'est pas le cas. p>
exemple: Laisse oublier les "étapes" pendant un moment et supposer que c'était une table d'élèves et que "Step" était plutôt "Groupes", les étudiants sont dévidés. Une exigence pour un groupe est qu'il existe un nombre pair d'élèves car les étudiants travailleront par paires. Pour un outil administratif, vous pouvez écrire une requête comme celle-ci pour voir une liste de groupes où cela n'est pas vrai. p>
groupe: compter A, 10 B, 9 C, 17 D, 8 E, 4 F, 5 P>
et la requête retournera des groupes B, C, F P>
Merci à tout le monde. Vous avez tous dit que la requête renvoie des rangées regroupées qui a un nombre impair. P>
Mais ce n'est pas pointu! Je continuerai à inspecter cette affaire et j'écrirai la raison dans l'esprit du programmeur (si je trouve qui écrivez cela) p>
Leçons apprises: les programmeurs doivent écrire des commentaires sur la logique stupide comme celle-là ... P>
Je ne pense pas que la logique est fausse, il est simplement mal codé. Si le développeur a utilisé une étape au lieu de * le code serait explicatif et ne nécessiterait pas de commentaires, voir ma réponse pour plus de détails
Testez simplement le test
select step, count(*) from @t1 group by step having count(*)%2 = 1
Vous êtes les bienvenus, je dois admettre que lorsque j'ai vu le code, je ne suis pas sûr de ce qui se passait, et c'était à cause de l'utilisation de "Select *"
Qu'est-ce que DB est-ce? Ce que les réponses ci-dessous disent sont vraies, cependant, je suis surprise, il fonctionne avec une sélection * dans un groupe par. Cela ne fonctionnerait pas dans MS SQLSERVER, car vous ne pouvez rien sélectionner qui n'est pas regroupé ni agrégé.
@Robin Day: La seule façon dont je sais que cela fonctionnera est si la seule colonne de
Table1 code> estétape code>Le problème est ici n'est pas la requête elle-même ... Je me demande ce qui peut être la raison d'écrire une requête comme celle-ci?
Je pense que l'utilisation de "Select *" est très déroutante dans cet exemple. Si cela a été remplacé par "SELECT STEP", il serait beaucoup plus facile de lire et de ne pas être sujets à une erreur si de nouvelles colonnes sont ajoutées à la table.