|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Mickael Inscription : mars 2011 Messages : 5 ![]() |
Bonjours à tous!
J'ai besoin d'aide sur une requête un peu compliquée pour moi.... je vais essayer de vous expliquer le plus clairement possible. Voila, j'ai une table qui s'appelle "radar" qui contient une liste de radar mobile (sur les routes donc) avec tout son historique. C'est à dire qu'un radar peut être présent plusieurs fois au même endroit (mêmes coordonées GPS). Mon but est de faire un "TOP 40" des apparitions dans la base de données : Trier en fonction du nombre d'apparition des radars au même endroit. De plus chaque enregistrement a un "commentaire" et il faudrait afficher le dernier commentaire enregistré pour illustré le top 40. En espérant avoir été assez clair. N'hésitez pas à me demander plus de précisions et merci pour votre aide! |
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour,
L'explication est assez claire, par contre, pourrais tu donner la structure des tables en jeu ? (si tu as essayé une requête, n'hésites pas à la poster, ça peut aussi aider a mieux comprendre ce que tu veux) Peux-tu aussi préciser ton SGBDR ? |
|
|
00
|
|
|
#3 | |||
|
Invité de passage
![]() Mickael Inscription : mars 2011 Messages : 5 ![]() |
Citation:
alors en fait cela ne concerne qu'une seule table, la table "radar" dont voici la structure : Code :
les champs qui nous intéresses donc sont les champs "position", ainsi que le champs "commentaire". |
|||
|
|
00
|
|
|
#4 | |||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
Je suppose qu'il ne peut y avoir deux lignes ayant le même debut à la même position... hmmm, position => text...ce sont les coordonnées GPS ? tu risque d'avoir des surprises ! (à 1 cm près, ce n'est plus la même position)... regarde donc d'ou proviennent les données... est-ce que cette requete te donne ce que tu veux ? Code SQL :
|
|||
|
|
00
|
|
|
#5 | ||||||||
|
Invité de passage
![]() Mickael Inscription : mars 2011 Messages : 5 ![]() |
Citation:
Citation:
Citation:
Citation:
Code :
|
||||||||
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
pardon, sous Postgre, il faudra peut etre utiliser :
en fin de sous-requete à la place du top 40 |
|
|
00
|
|
|
#7 | ||
|
Invité de passage
![]() Mickael Inscription : mars 2011 Messages : 5 ![]() |
Ca fonctionne pas mal ! l'ordre n'était pas bon, mais avec l'ajout d'un ORDER BY, tout est entré dans l'ordre!
la requête finale est donc Code :
|
||
|
|
00
|
|
|
#8 | ||
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Bonsoir,
Le ORDER BY dans la sous-requête est tout à fait inutile. Pour simplifier la lecture, personnellement je placerais le LIMIT sur la requête principale et j'utiliserais une jointure naturelle (il faut en profiter sur PostgreSQL). Code :
|
||
|
|
11
|
|
|
#9 |
|
Invité de passage
![]() Mickael Inscription : mars 2011 Messages : 5 ![]() |
je ne suis pas un expert en postgresql et je me pose une question :
quelle est la différence entre une jointure naturelle, et une jointure "classique" ? |
|
|
00
|
|
|
#10 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Voila qui est bien péremptoire !
J'ai bien dis : Citation:
|
|
|
|
00
|
|
|
#11 | |||||||
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Citation:
Le tri est nécessaire à cause du TOP. Pour la jointure naturelle. Celle-ci ne nécessite pas de condition de jointure (ON ..). La jointure est effectuée en se servant des colonnes qui ont un nom (et type normalement) commun entre les deux tables. Avec les tables: Code :
Code :
Code :
Plus d'erreur d'ambiguité lorsque vous faites "SELECT Cli_id.." et que le SGBDR ne sait pas de quelle table vient cette colonne. Plus besoin de préfixer le nom des colonnes par le nom de la table. |
|||||||
|
|
00
|
|
|
#12 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
|
|
|
|
00
|
|
|
#13 | |
![]() ![]() |
Citation:
À part introduire confusion et ambiguïté dans le code, elle n'apporte rien d'intéressant si ce n'est de réduire de quelques octets le code de celle-ci. Je la déconseille plus que fortement.
__________________
Email : http://scr.im/waldar |
|
|
11
|
|
|
#14 |
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
|
|
|
11
|
|
|
#15 | ||||||
![]() ![]() |
Très bien, vous arrivez dans une nouvelle société, on vous explique que l'application de facturation ne fonctionne plus.
Le DBA vous informe que c'est la requête suivante qui ne va plus (il vous précise aussi que chaque table possède cinquante colonnes) : Code :
Si la requête était écrite comme ceci, combien de temps allez-vous gagner ? Code :
Code :
__________________
Email : http://scr.im/waldar |
||||||
|
10
|
|
|
#16 | |||
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Je n'ai jamais affirmé qu'il fallait remplacer toutes les jointures internes par des jointures naturelles lorsqu'on écrit ses requêtes.... j'utilise les jointures internes et naturelles régulièrement en fonction des cas.
Une personne qui écrirait ce genre de requête, avec 8 jointures naturelle manque de bon sens... c'est évident... Est-ce une raison suffisante pour "proscrire" l'utilisation de cet opérateur en SQL ? On plaisante ? Citation:
Toutefois j'ai quelques notions de théorie relationnelle, et je sait que l'opérateur de jointure (naturelle) est associatif et commutatif. L'ordre des tables n'a aucune importance.... le résultat devrait être le même. Entre nous, si on devait proscrire du langage SQL tout ce qui est source de "confusion" et "ambiguïté"... il ne resterait plus grand chose... |
|||
|
|
00
|
|
|
#17 | ||||
![]() ![]() |
Citation:
C'est la même chose. Citation:
Les requêtes non maîtrisées c'est la cause numéro 1 de tous les problèmes de bases de données. Que faites-vous quand votre modèle de données évolue ? Vous contrôlez toutes vos requêtes avec NATURAL JOIN à cause des jointures automatique sur le nom ? Citation:
Vraiment, c'est magnifique ! Citation:
__________________
Email : http://scr.im/waldar |
||||
|
00
|
|
|
#18 | |||
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Citation:
L'opérateur de jointure naturelle est un opérateur de base (historique), il est fondamental dans la théorie relationnelle et son algèbre. Je suis bien content que certains SGBDR me le propose et je l'utilise en ayant pleinement conscience de ses possibilités (positives ou moins positives). D'ailleurs l'opérateur "INNER JOIN .. ON.." n'ajoutes-t'il pas trop d'octets par rapport à une jointure effectuée par la restriction d'un produit cartésien ? Citation:
En appliquant ce raisonnement, est-ce que vous proscrivez aussi l'opérateur UNION ? Citation:
|
|||
|
|
00
|
|
|
#19 |
|
Membre chevronné
![]() Administrateur de base de données Inscription : août 2009 Messages : 404 ![]() |
Concernant les problèmes de confusion et incohérences du langage SQL, c'est comme une boite de chocolat, il y a tout les parfums, je ne sait pas où commencer.
Il y a aurait des centaines de pages de Chris Date (par exemple) à citer mais je n'aurai aucun ouvrage sous la main avant ce week-end. Je vais citer les plus importants tout de même:
|
|
|
00
|
|
|
#20 | ||||||
![]() ![]() |
Je ne vois pas le rapport avec UNION ?
Quelques citations en trente minutes de recherche : MySQL : Citation:
Citation:
Citation:
Citation:
Citation:
Citation:
__________________
Email : http://scr.im/waldar |
||||||
|
00
|
Copyright © 2000-2012 - www.developpez.com