0
votes

Existe la clause de clause avec la clause supérieure dans la sous-requête

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)

  1. Query de travail avec la clause LI> ol> xxx pré>

    Cependant, je veux convertir la clause dans une clause existante plus efficace p>

    1. code ne fonctionne pas avec une clause existante li> OL>
          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
      


7 commentaires

Mis à part votre problème, une requête top x n'a aucun sens sans une commande par 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 est plus efficace que dans ? 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 :)


4 Réponses :


0
votes

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: xxx

ou xxx

Vous devez tester lequel est le meilleur dans votre cas


0 commentaires

0
votes

Je peux suggérer que vous devriez aller pour rejoindre interne . 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 condition. Plutôt, vous pouvez utiliser une simple jointure intérieure pour obtenir la sortie souhaitée.

Comme dans votre exemple, vous avez juste besoin de top 2 des clients ayant le fret_charges Valeur à 2 . Vous pouvez utiliser ci-dessous la requête en utilisant Joindre interne . xxx

S'il vous plaît laissez-moi savoir vos commentaires.


1 commentaires

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.



0
votes

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.

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.

Dans votre cas, il n'existe pas de bon choix pour vous.

Veuillez vérifier ce lien: https://www.sqlservertorial.net/sql-server-basics / SQL-Server-Exist /


0 commentaires

0
votes
   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
    )

1 commentaires

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.