Devrais-je utiliser le Haut(1) dans une sous-Requête
Exemple De Requête:
select *
from A join B on A.ID = B.SOMEVALUE
where A.VALUE="something" and
B.ID =
(select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...))
donc, si vous pouvez lire SQL, vous devez voir que je suis en train de faire un couple de sous-requêtes corrélées pour affiner les résultats de la jointure . (et oui, c'est horriblement simplifiée).
Dans certains cas, la sous-requête:
select ID from B where SOMEVALUE = A.ID and
THISDATE = (select max(SOMEDATE) from B where ...)
peut renvoyer plus de valeur 1, ce qui provoque une erreur
"Sous-requête a renvoyé plus de valeur 1.
Ce n'est pas permis lorsque l'
sous-requête suit =, !=, <, <= , >, >=
ou lorsque la sous-requête est utilisé comme un
d'expression".
qui je l'espère. Ce n'est évidemment pas une bonne chose et je code à la place de (espérons-le) d'éviter ces doublons d'entrer dans la base de données en premier lieu (c'est à dire le tableau B devrait seulement 1 ligne qui correspond à la
SOMEVALUE = A.ID and max(SOMEDATE)
critères), cependant les utilisateurs finaux ne sont rien si ce n'créatif dans la recherche de moyens je ne peux pas penser à briser logiciel.
Donc maintenant à ma question:
Serait-il préférable de modifier la première sous-requête pour
select top 1 * from B ...
pour empêcher l'utilisateur de voir une erreur quand/si (j'espère jamais) cette situation se produit, ou de laisser l'erreur de venir à travers. Je me suis penchée pour ne pas ajouter du haut de déclaration et de laisser l'erreur de venir à travers, plutôt que de permettre à l'utilisateur de voir potentiellement des données incorrectes. Je me demandais si quelqu'un a des idées sur les Meilleures Pratiques dans ce genre de situation...
OriginalL'auteur pfunk | 2009-01-30
Vous devez vous connecter pour publier un commentaire.
Normalement TOP 1 est une bonne idée.
Envisager une grande table avec des millions de lignes avec pas d'index sur la colonne correspondant, cependant, vous êtes seulement à la recherche d'une seule ligne.
SELECT TOP 1 signifie l'analyse de la table s'arrête dès qu'un élément est trouvé.
Sans le TOP 1, l'analyse de la table continuera jusqu'à la fin.
Comme avec tout ce qui implique la numérisation (ou de la force brute) pour faire de la recherche. À l'aide de TOP 1, il doit en moyenne être 50% plus rapidement que n'utilisant pas TOP 1.
Toutefois, en Fonction de ce que vous avez besoin de revenir en arrière, Un réel gain de performance peut être normalement effectuée par l'aide EXISTE.
Au lieu d'écrire
Vous pouvez utiliser
OriginalL'auteur John
Pourquoi vous joindre à la table A et B..., puis en sélectionnant à partir de B dans la sous requête... et en la comparant à une colonne dans une???
Ne serait-ce pas équivalent:
Aussi, si vous vous attendez à obtenir une ligne totale de l'ensemble de cette requête... ne serait-ce pas le travail:
Pourquoi ne pas vous me montrer la vraie question?
la deuxième requête ne fonctionne pas car à partir de l'extérieur-la plupart des requêtes, je ne veux plus d'une ligne. Mais après avoir laissé mijoter un peu, je crois que j'ai peut-être sauté le pistolet et la première requête. La seule différence est que je voudrais obtenir plusieurs lignes où avec ma requête, je voudrais générer une erreur
Sur les deux exemples, vous pouvez inclure le "A", "VALUE=" quelque chose "" dans le cadre de l'adhésion de la condition, vous souhaitez enregistrer quelques millisecondes ici par filtrage début plutôt que de faire la jointure d'abord, puis de filtrage
OriginalL'auteur bobwienholt
Pratique de codage: Placer top1 dans une sous-requête qui est nécessaire pour retourner une seule valeur.
Pour:
Contre:
OriginalL'auteur Amy B
Je recommande le TOP 1 de l'approche. Il sera probablement aider à la performance (pas susceptibles de le blesser).
L'idée que, sans elle, vous allez attraper des erreurs est honorable, mais un peu égaré. Si une erreur se produit ici mois à partir de maintenant, il ne sera PAS intuitif du tout pourquoi elle a eu lieu ou ce qui se passe. Au lieu de cela, j'avais l'accent sur le respect de l'intégrité des données ailleurs.
OriginalL'auteur Michael Haren
Pourquoi ne pas utiliser
LIMIT 1
à la fin de votre sous-sélection?D'accord avec Michael, c'est une saveur différente, afin de LIMITER 1 ne serait probablement pas en fait de travailler dans cette syntaxe.
Ne pas répondre à la question, mais il n'est de clarifier ce que la question a été suggérant, pour ceux peu familiers avec le TOP 1 de la syntaxe.
OriginalL'auteur inkedmn
Si vous êtes à la recherche de retour juste une ligne unique que vous pourriez faire une de deux choses. La première est de changer votre contrôle d'égalité au lieu de vérifier confinement comme
(Avis de l')
D'autre part, vous pourriez faire
si vous êtes seulement à la recherche d'une seule valeur.
Ou comme vous l'avez dit, vous pouvez changer les sous-requête SELECT TOP 1 qui est correct, à mon avis, parce que tant que la clause where n'est pas la personne à charge sur l'extérieure de la requête, il ne sera probablement exécuter la requête imbriquée qu'une seule fois et de s'appuyer sur un stockées de façon statique de la valeur à partir de là, comme
Donc il y a peu d'options, mais je ne suis pas entièrement sûr de leur efficacité.
OriginalL'auteur Kezzer