J'ai une sous-requête de requête ci-dessous (But Top 2 commandes de la table de commande dont Freight_Charges = 2 et obtenez les clients de ces commandes)
Cependant, je veux convertir la clause dans une clause existante plus efficace p>
SELECT C.* FROM Customers C INNER JOIN ( SELECT TOP 2 CUST_ID FROM Orders where FREIGHT_CHARGES = 2 ) O ON C.CUST_ID=O.CUST_ID
4 Réponses :
Si vous mélangez existe avec le haut, il n'y a pas de différence que vous l'utilisez sans haut, car Existe " renvoie true si une sous-requête contient des lignes ".
Dans votre cas, vous pouvez vérifier les requêtes: p> ou p> Vous devez tester lequel est le meilleur dans votre cas p> p>
Je peux suggérer que vous devriez aller pour Comme dans votre exemple, vous avez juste besoin de S'il vous plaît laissez-moi savoir vos commentaires. P> p> rejoindre interne code>. C'est toujours une bonne pratique pour éviter les sous-sollicitations si possible car il est exécuté à chaque rangée de la table principale, car elle est dans
où code> condition. Plutôt, vous pouvez utiliser une simple jointure intérieure code> pour obtenir la sortie souhaitée.
top 2 code> des clients ayant le
fret_charges Code> Valeur à
2 code>. Vous pouvez utiliser ci-dessous la requête en utilisant
Joindre interne code>. P>
La requête que vous avez affichée ne fonctionnerait pas si j'ai le même client avec plus de 1 ordre dans la table de commande. Cependant, je vais prendre la suggestion de jointure intérieure que vous avez donnée. J'étais un peu confus avec la performance de la jointure intérieure et existe et n'était pas sûre de savoir lequel utiliser.
L'opérateur existe est un opérateur logique qui vous permet de vérifier si une sous-requête renvoie n'importe quelle ligne. L'opérateur existe est vrai si la sous-requête retourne au moins une ligne ou plus. P>
Donc, étant donné que chaque ligne de la table de commande avec fret_charges = 2 reviendra true pour une déclaration existante (peu importe si elle est top 2, 1 serait suffisant) Le résultat comprend tous les enregistrements de la table des clients avec des commandes Cust_IDS appropriées. p>
Dans votre cas, il n'existe pas de bon choix pour vous. P>
Veuillez vérifier ce lien: https://www.sqlservertorial.net/sql-server-basics / SQL-Server-Exist / P>
SELECT Top 2 * FROM Customers as C WHERE EXISTS ( SELECT O.CUST_ID FROM Orders as O where FREIGHT_CHARGES = 2 AND C.CUST_ID = O.CUST_ID )
Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses uniquement des liaisons peuvent devenir invalides si la page liée change.
Mis à part votre problème, une requête
top x code> n'a aucun sens sans une commande
par code> clause. Sinon, vous sélectionnez simplement x lignes au hasard (dans un sens).
Je pourrais ajouter la commande par clause Cependant, n'est-ce pas par défaut de commander avec la clé primaire? Comme dit, je reçois le résultat souhaité à l'aide de la 1ère requête, mais si je dois utiliser la clause existante, je reçois la question. Lire dans le lien ci-dessous aussi bien mais je n'ai pas pu obtenir la réponse Stackoverflow.com/Questtions/34759173/...
Sans ordonnance par clause, la commande est arbitraire (et peut-elle peut-elle ou non ordonner en utilisant la clé primaire en fonction de ce que le plan d'exécution dicte est le plus efficace). Ceci est tellement par définition. Aucun ordre par clause => Commande arbitraire.
@Tt. Merci pour cette suggestion, je vais également ajouter la commande par clause.
Qui a dit que
existe code> est plus efficace que
dans code>? Si les deux expressions sont logiquement équivalentes (pas votre cas!), SQL Server produit le plus souvent des plans de requête identiques de toute façon.
@Arvo. Je suis juste en train de passer des contenus sur Internet et je dois savoir qu'exister et les jointures ont toujours une meilleure performance qu'une clause d'une clause. Merci.
Comme je l'ai dit, lorsque les requêtes sont logiquement identiques, la performance est généralement la même. Ne croyez pas tout sur Internet :)