Il y a une variable de table (je vais l'écrire comme une table régulière ici) Ce tableau a des centaines de milliers de lignes, mais pour cet exemple, j'ai ajouté beaucoup moins P> par exemple p> J'avais réussi à le faire fonctionner avec des sous-demandes, mais en raison de la taille de la table, cela pourrait prendre plus de 2 minutes. courir. P> J'apprécierais que quelqu'un sait un meilleur moyen de y parvenir? p> p>Member Book Clothes Both
1 0 0 1
2 1 0 0
3 1 0 0
4 0 1 0
5 0 0 1
6 1 0 0
7 1 0 0
3 Réponses :
Une méthode utilise une agrégation conditionnelle: Ceci fonctionne car il n'y a que deux produit code> s. Si vous en avez réellement plus, alors vous avez besoin d'expressions plus compliquées (et éventuellement plus efficaces), telles que: p>
@Ragnar: Exécutez-vous la toute dernière version de la requête? J'ai édité ma réponse il y a quelques minutes.
Cela a fière allure, il ne s'agira que de 2 variantes et des deux. Donc cela pourrait être génial. Je vais essayer demain sur le jeu de données complet et vous le faire savoir. Mais merci pour toute votre aide! J'apprécie beaucoup.
@Ragnar. . . C'est une meilleure solution que les alternatives. Aucun CTE ou sous-requête n'est nécessaire et compteur (distinct) code> est généralement plus coûteux que les autres fonctions d'agrégation.
Merci @gordonlinoff, je vois ton point. Je vais marquer cela comme la réponse à quelqu'un d'autre qui a le même problème.
Si vous n'avez que deux valeurs possibles, la logique peut être simplifiée pour: Case lorsque Max (ProductType) = 'Book' puis 1 else 0 Entrée de livre, Case quand Min (ProductType) = 'Vêtements' puis 1 Vêtements d'autre 0 , code>
@Dnoeth: ah oui, vous êtes correct, c'est plus court une requête (bien qu'aucun bénéfice de performance depuis les deux min () code> et
max () code> doit être calculé pour chaque groupe) . J'ai changé la requête en conséquence, merci.
Une variable de table avec des centaines de milliers de lignes va être problématique pour vous.
Si vous vérifiez votre plan de requête, vous verrez probablement que l'optimiseur s'attend à ce que la variable de table ne contienne qu'une ligne. P>
Modification de la structure en une table Temp locale et peut-être ajouter un index à productType code> doit améliorer considérablement les performances de la requête avant même d'optimiser votre code. p>
Utilisez un CTE pour obtenir si chaque membre a Voir le book ou / ou
vêtements code>:
Résultats: P> > memberid | book | clothes | both
> -------: | ---: | ------: | ---:
> 1 | 0 | 0 | 1
> 2 | 1 | 0 | 0
> 3 | 1 | 0 | 0
> 4 | 0 | 1 | 0
> 5 | 0 | 0 | 1
> 6 | 1 | 0 | 0
> 7 | 1 | 0 | 0
C'est bien merci, je n'avais pas entendu parler de CTE auparavant. Il est temps de brosser mes compétences SQL :)
@Ragnar Voici un lien où vous pouvez trouver plus: docs.microsoft.com/en-us/sql/t-sql/queries/...
max (cas lorsque ProducteurType = 'book' puis 1 autre 0 extrémité) code> doit être plus efficace que
compter distinct code>.
@Dnoeth sûr. S'il y a vraiment des centaines de milliers de lignes i> dans la table, il s'agit d'une option qui mérite d'être essayée.
Alors qu'avez-vous essayé, pourquoi cela n'a-t-il pas fonctionné? Vous demandez «Qu'est-ce qui est une meilleure façon», mais une meilleure façon que ce que i>? Si vous avez utilisé des sous-coutumes, montrez-nous ces sous-requêtes. Vous n'avez rien montré que nos tentatives peuvent être «meilleures» que.
En règle générale, l'optimisation du lieu de démarrage est le plan exécution i>. S'il vous plaît voir Collez le plan pour un moyen d'inclure un plan d'exécution dans votre question.