Bonjour,
Est-ce que toute sous requête peut être representée par une jointure de tables ?
Merci d'avance
Bonjour,
Est-ce que toute sous requête peut être representée par une jointure de tables ?
Merci d'avance
Une sous-requête est une requête à l'intérieur d'une autre. Avec le langage SQL, vous pouvez écrire des requêtes imbriquées sur autant de niveaux tout comme vous pouvez également mélanger jointures et sous-requêtes. Une requête peut être aussi complexe que vous le voulez tant qu'elle reste correcte.Sous-requête ou imbrication
Certains préfèrent les sous-requêtes aux jointures pour la simplicité du code, sauf qu'elles peuvent être moins rapide à l'exécution.
Non !
Soyons logique, si l'on a inventé les sous requêtes, c'est parce qu'elle servent à quelque chose.
Certaines sous requêtes peuvent être remplacer par des jointures, mais pas toutes !
L'exemple typique est la recherche de tuple(s) ayant une caractéristique à un point particulier (extrémum, médiane, moyenne...).
Pour vous former au SQL, lisez le livre que j'ai écrit :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 SELECT * FROM UnEnsembleDeDonnées WHERE UneCaractéristique = (SELECT MAX(UneCaractéristique) FROM UnEnsembleDeDonnées)
A +
en l’occurrence, on peut le remplacer par une jointure externe
(ou même une fonction fenêtrée mais ce n'est pas l'objet du débat...)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT A.* FROM UnEnsembleDeDonnées AS A LEFT OUTER JOIN UnEnsembleDeDonnées AS B ON B.UneCaractéristique > A.UneCaractéristique WHERE B.UneCaractéristique IS NULL
Je dirai que toutes les sous-requêtes servant de restriction peuvent en effet être remplacées par des jointures (pas forcément mieux au niveau perfs toutefois)
En revanche, pour ce qui est des sous-requêtes en table dérivée, ce n'est pas toujours possible.
Par exemple à une sous-requête qui fait un UNION, ou plusieurs sous-requête qui font des agrégats
Une sous-requête utilisée avec IN ou EXISTS ne peut pas toujours être remplacé par une jointure, en particulier avec des relations 0,1-N.
en effet...
Ou alors, remplacer par une jointure sur... une sous-requête en table dérivée
Pourquoi donc ? j'ai loupé quelque chose ?
Tu trouvera toutes les valeurs supérieures et non la plus grande.
A +
merci mais ce n'est pas plutôtou bien dans le where stocker dans une liste et prendre le max
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 SELECT A.* FROM UnEnsembleDeDonnées AS A LEFT OUTER JOIN UnEnsembleDeDonnées AS B ON A.UneCaractéristique > B.UneCaractéristique WHERE B.UneCaractéristique IS NULL
merci j'enlèveet dans ce where après avoir stoker dans une varriable un liste je prends le max de cette liste
Code : Sélectionner tout - Visualiser dans une fenêtre à part B.UneCaractéristique IS NULL
merci d'avance
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager