|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
Bonjour,
J'ai la requette suivante qui me retourne les dernière visite (par date) lié à un couple intervention/equipement : Code :
en creusant nous avons finalement trouvé qu'il fallais qye l'order by soit sur Code :
i1.intervention_id,v.equip_vess_id,v.finish_dttm En effet il semble que l'order by regroupe le résultat de la sous requette sans tenir compte du tri. Mon problème est résolu, mais j'aimerias bien avoir comprendre ou se trouve l'erreur (dans ma logique ou dans le moteur postgres) Merci, P |
||
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 2 161 ![]() |
Bonjour,
Quelle version de postgresql utilisez vous ? LAST ne semble pas exister en v9.0+ |
|
|
00
|
|
|
#3 | ||
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
effectivement, LAST() est une fonction maison (super pratique)... je suis sur postgres 8.3
La fonction last : Code :
|
||
|
00
|
|
|
#4 | ||
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
en cadeau la fonction FIRST :
Code :
|
||
|
00
|
|
|
#5 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Votre erreur vient du fait que la clause ORDER BY est normalement interdite dans les sous requêtes. Même si vous la mettez elle n'a en général aucun effet.
En effet, la clause ORDER BY n'est, par nature, par relationnelle. Elle ne sert qu'a présenter un résultat (et non pas une table dérivée, c'est à dire une table créée à la volée dans une sous requête) et c'est que que l'on appelle une clause COSMÉTIQUE. À me lire : http://sqlpro.developpez.com/cours/sqlaz/erreurs/#L9 Pour réaliser des opérations ordonnées, il existe toute une classe de fonction appelées fonction de fenêtrage, comme RANK(), ROW_NUMBER(), LEAD(), LAG(). Apprenez le langage SQL. Notamment : http://sqlpro.developpez.com/article...clause-window/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#6 | ||||||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 2 161 ![]() |
Donc vous utilisez des fonctions "maisons" dont vous ne comprenez pas le méchanisme ? :p
un test tout simple qui vous permettra de comprendre son fonctionnement : Code :
Code :
Avec votre fonction : Code :
Code :
|
||||||||
|
|
00
|
|
|
#7 | |||||
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 2 161 ![]() |
Citation:
Dans le cas de PostGresql ca me semble un peu différent. (je ne remet en cause le fait que cela soit interdit ou non au vu de la norme). Code :
Code :
|
|||||
|
|
00
|
|
|
#8 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Citation:
Votre position est parfaitement idiote, car il n'y a aucune garantie de reproduction du résultat, le SGBDR étant libre de lire les données dans l'ordre qu'il souhaite et non dans celle que vous lui indiquez (gestion ensembliste). Malheureusement mettre cela en évidence, nécessite des jeux de données importants (dépassant le volume du cache) et diffère suivant l'indexation. A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
|
|
#9 | |
![]() ![]() Inscription : octobre 2008 Messages : 1 702 ![]() |
Citation:
Ca ne devrait pas être trop compliqué de la réécrire dans une version juste. Sachant qu'en 8.3 il n'y pas de fonction de fenêtrage, il faut procéder en extrayant d'abord la date max avec GROUP BY qui va bien et ensuite en joignant avec le reste pour récupérer les valeurs des autres colonnes associées à cette date. |
|
|
|
00
|
|
|
#10 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 2 161 ![]() |
Citation:
Nous parlons de postgresql ici. Je suis bien conscient de votre argumentation mais si vous faites des recherches ça ne semble pas si blanc / noir au niveau de se fonctionnement : http://postgresql.1045698.n5.nabble....td5527695.html En particulier les derniers message de la discussion. Si j’interprète bien ces messages (en particulier ceux de Tom Lane) : - La clause order by n'est pas légal dans une sous requete (sans utilisation d'un top / offset ?) - Si un utilisateur en à mis une c'est pour une raison bien précise. - A partir de ce moment là l'order by est honnoré car l'utilisateur l'a mit edit : non valide nb: ce message n'est pas fait pour encourager notre posteur à continuer d'utiliser sa méthode mais de mieux comprendre certaine spécificité de l'optimiseur postgres |
|
|
|
00
|
|
|
#11 | |||||
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
Citation:
|
|||||
|
00
|
|
|
#12 | |
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
Citation:
Selon la machine, notre requête initial ne retourne pas les mêmes résultats bien que les version postgres et Linux soient identiques... Peut être que la taille des cache diffère, à vérifier. Cependant, l'ajout d'un ORDER BY plus complet à permis de corriger le résultat... Il est clair que l'optimiseur postgres y est pour quelque chose... |
|
|
00
|
|
|
#13 | |
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
Citation:
|
|
|
00
|
|
|
#14 | |
|
Expert Confirmé
![]() Inscription : mai 2002 Messages : 2 161 ![]() |
Citation:
|
|
|
|
00
|
|
|
#15 | |
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
Citation:
Mise à part une présomption de culpabilité, j'ai du mal à comprendre ce qui "concrètement" en interdit l'usage. |
|
|
00
|
|
|
#16 | ||
![]() ![]() Inscription : octobre 2008 Messages : 1 702 ![]() |
Citation:
L'ironie de cette discussion est que tu as toi-même constaté le problème dès le 1er message: Citation:
|
||
|
|
00
|
|
|
#17 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Mais rien n'empêche les gens de se suicider !
Actuellement vous ne voyez pas les effets de bord, car votre jeu de données est biaisé et comme vous pensez que vous avez raison, vous allez continuer stupidement à mettre en œuvre cela jusqu'au jour ou vos utilisateurs découvrirons sans doute trop tard les bogues que vous avez sciemment introduit en toute connaissance de cause dans le logiciel. Errare humanum est, perseverare diabolicum ! A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#18 | |
|
Membre régulier
![]() Patrice DelormeInscription : mai 2007 Messages : 187 ![]() |
Citation:
J'ai effectivement du mal à croire que postgres n'ait pas la gentillesse de conserver mes Order by. Merci en tous cas pour ces explications qui m’ont remis dans le droit chemin! Amen ! |
|
|
00
|
|
|
#19 |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Il serait peut être temps de comprendre ce qu'est un SGBD Relationnel !
La théorie de l'Algèbre Relationnelle a été bâtie sur la théorie des ensembles qui ne possède aucune relation d'ordre de manière naturelle. La clause ORDER BY de SQL ne fait d'ailleurs pas partie de l'algèbre relationnelle. C'est pourquoi les SGBDR l'ignorent en général, ou bien signalent l'erreur, lorsqu'elle figure à l'intérieur des requêtes. En fait il s'agit d'une clause COSMÉTIQUE c'est à dire appliqué au rendu du résultat et c'est pourquoi elle ne doit figurer qu'une seule fois et à la toute fin de la requête. On a jugé plus pratique de rajouter cette clause au langage, parce qu'il est généralement moins couteux de demander au SGBDR de trier les données que de le faire sur le poste client. En effet, au niveau physique, il est parfois possible d'éviter le coût du traitement du tri par le simple fait de l'existence d'un index adéquat, puisqu'un index est généralement une forme de tri... Si vous regardez comment est conçu l'intérieur d'un SGBDR, vous remarquerez que la partie qui assure le tri n'est pas du tout située dans le moteur relationnel. En effet les requêtes sont de l'algèbre relationnelle, donc relève du moteur relationnel, c'est à dire de la partie LOGIQUE du SGBDR. En revanche le tri est une opération physique (le résultat d'une requête est le même que les données soient triées ou non) et relève donc du moteur de stockage ! La partie logique (requêtes relationnelle) est assurée par le moteur relationnel, tandis que la partie physique est assurée par le moteur de stockage. Et c'est bien le moteur de stockage qui doit effectuer la lecture de l'index ou s'il n'y a pas d'index adéquat, effectuer l'opération physique des tri des lignes résultant de la requête relationnelle. Pour vous en convaincre, voici l'architecture interne de MS SQL Server... http://www.developpez.net/forums/att...1&d=1351259693 Tous les SGBD relationnel sont bâtis sur les mêmes principes de séparation : Physique : stockage, indexation, lectures, écritures, verrouillage, gestion des transactions, chargement de données via des fichiers externe, sauvegarde, restauration... Logique : analyse grammaticale, vérification des privilèges, transformation diverses (XML, Full-Text, SIG...), algébrisation, optimisation, exécution... A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
00
|
|
|
#20 | |
![]() ![]() ![]() Frédéric BROUARDExpert SGBDR & SQL Inscription : mai 2002 Messages : 12 099 ![]() |
Citation:
À me lire : http://sqlpro.developpez.com/article...clause-window/ A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/ Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp. Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation * * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * * |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com