Probleme de requete. - SQL/NoSQL - Programmation
Marsh Posté le 05-12-2005 à 18:05:46
T'as essayé un truc du style :
select numero
from
(select numero, montant
from ...)
where montant = max(montant)
Marsh Posté le 05-12-2005 à 18:18:15
Code :
|
Aggregates not alowed in where clause ...
Marsh Posté le 05-12-2005 à 18:45:59
ah, oui...
alors avec un truc genre :
...
where not exists (select truc from chose2 where chose2.montant>chose1.montant)
Marsh Posté le 05-12-2005 à 20:27:48
skeye > tu vas finir par y arriver
Code :
|
Marsh Posté le 05-12-2005 à 20:32:25
Code :
|
PS: la vue est inutile, on peut aussi écrire comme suit (mais c'est le bordel à relire)
Code :
|
Marsh Posté le 05-12-2005 à 21:47:14
Arjuna a écrit : skeye > tu vas finir par y arriver |
Flemme de tester...
Marsh Posté le 06-12-2005 à 17:23:28
Code :
|
Marsh Posté le 06-12-2005 à 17:25:49
Beegee a écrit :
|
Chronoklazm a écrit : |
Je pense que rownum n'es tpas accepté non plus...
Marsh Posté le 06-12-2005 à 17:35:48
rownum ne marche que sur Oracle pour être plus exact, donc c'est tout aussi limitatif car non portable.
cherchez pas, la norme sql92 n'avait pas prévu du tout de filtrage sur les "n premiers tuples".
postgre est le premier à avoir ajouté cette fonction, avec "TOP" (et pour cette raison elle a été ajouté dans SQL 99, PostGre étant le SGBD le plus proche de la norme, ses propositions pour la norme sont prioritaires sur les autres produits)
ça a été repris par DB2 il me semble, access et SQL Server
mysql a ajouté son LIMIT
oracle a utilisé rownum qui ne permet pas de faire ce qu'on veut (bien plus limité que TOP et LIMIT (limit étant le plus souple))
Marsh Posté le 06-12-2005 à 20:24:33
Il n'est pas plus limité, il est juste plus chiant à écrire.
Marsh Posté le 06-12-2005 à 20:50:40
si, il est limité car il est quasi impossible de faire une requête équivalente ) "limit 5, 10".
avec des top imbriqués, on peut mais c'est chiant. avec le rownum, c'est la merde car il ne s'applique pas aux sous-requêtes
Marsh Posté le 06-12-2005 à 20:53:51
Code :
|
C'est une habitude à prendre ...
Et puis en l'écrivant de cette façon, Oracle optimise le plan d'exécution.
Marsh Posté le 06-12-2005 à 22:45:27
hmmm... ça marche à partir de quelle version ?
parceque pour moi, rownum compte à partir de la première ligne retournée. ainsi :
where rownum <= x
=> Retourne X lignes, de 1 à X
where rownum >= x
=> Ne retroune aucune ligne, la première étant = à 1, et supprimée, alors la seconde est égale à 1 aussi et est supprimée, et ainsi de suite
where rownum = x
=> Retourne la première ligne si x = 1, 0 sinon. (pour la même raison que précédement)
C'est en tout cas le comportement que j'ai pu constater avec Oracle 7.3 et Oracle 8.0.5, confirmé par la documentation de ces deux versions.
Ceci dit, je n'ai jamais testé avec une version plus récente. De plus, avec ces version :
select * from
(select champs, ..., rownum from matable)
=> ca plante, "rownum" étant interdit dans une sous-requête. peut-être que ça a changé depuis, vais essayer ça dès demain au boulot
Marsh Posté le 06-12-2005 à 22:52:19
t'ain, ça marche avec la 9i chais plus combien !
PS: Je vous rassure, chuis pas retourné au boulot en 5 minutes, y'a juste que je viens de tilter que je pouvais me connecter au taff avec Citrix Metaframe
Bien pratique de lancer TOAD depuis mon PC alors qu'il s'exécute réellement sur un serveur du taff !
Marsh Posté le 06-12-2005 à 22:52:44
Ca m'apprendra à taper trop vite, en fait il faut aliaser le rownum dans la sous-requête pour que ça marche
SELECT * FROM
(SELECT rownum as rnum, sub.* FROM
(SELECT * FROM maTable
ORDER BY monChamp) sub
WHERE rownum <= 10)
WHERE rnum >= 5;
Marsh Posté le 06-12-2005 à 22:53:21
En regardant les codes produit de la base de prod au boulot, je me demande pourquoi j'ai pas fait les tests sur la base de dev, elle à l'air plus propre
Marsh Posté le 06-12-2005 à 22:54:01
Ceci dit, sûr et certain, jusqu'à la version 8.0.5, ça ne marchait pas !
Tiens, vais faire un test d'ailleurs, j'ai un doute affreux...
Marsh Posté le 06-12-2005 à 23:01:22
[MagicBuzz qui découvre oracle, sur lequel il travaille depuis 6 ans]
select rownum, codpro
from (select codpro from pro
where codsoc = 2 order by codpro)
where rownum <= 5
t'ain, c'est tout le fonctionnement de rownum qui a changé en fait !
avant, un test sur le rownum s'executait comme un having, c'est à dire une fois la requête terminée et les tri effectués
et maintenant, on peut utiliser order by dans une sous-requête !
[/MagicBuzz qui découvre oracle, sur lequel il travaille depuis 6 ans]
Marsh Posté le 06-12-2005 à 23:02:42
en fait, maintenant, c'est limite plus souple que TOP n, mise à part qu'on doit forcément passer par une sous-requête si on veut que ça respecte le tri
Marsh Posté le 07-12-2005 à 07:27:52
Ah mais alors ça c'est bon à savoir!
Marsh Posté le 07-12-2005 à 09:51:00
Code :
|
Plan d'exécution avec ce type de requête Oracle :
SELECT STATEMENT Hint=RULE
VIEW
COUNT STOPKEY
VIEW
TABLE ACCESS BY INDEX ROWID CUSTOMER
INDEX FULL SCAN CUSTOMER_PK
On voit bien le COUNT STOPKEY qui signifie que l'index (ici le champ est indexé) est parcouru, mais pas intégralement (on s'arrête à la 10ème valeur).
Evidemment, il ne faut pas inverser la requête et faire rownum >= 5 en 1er, car alors rien n'est renvoyé (étant donné que le rownum ne s'incrémente que lorsqu'une ligne est renvoyée ...).
Marsh Posté le 05-12-2005 à 17:24:05
Hello,
J'ai un petit probleme avec une requete sql compatible oracle ... et meme tout sgbd respectant la norme.
J'ai 2 tables :
Ligne(numero_facture,quantité,ref_article, ligne_numero) PRIMARY KEY (numero_facture, ligne_numero)
Article(reference, prix) PRIMARY KEY (reference)
Mon but est d'obtenir la facture qui a la plus grande valeur.
Voici la requete qui marche au top sous Postgres
Mais malheuresement le LIMIT n'existe pas sous Oracle. Et donc tant qu'a faire j'ai cherché une variante un peu universelle sans LIMIT ou ROWCOUNT mais j'ai du mal.
Quelqu'un aurait il une idée svp ?
EDIT :
Genre comme ca :
mais bon ca marche pas quoi
Message édité par Chronoklazm le 05-12-2005 à 17:37:05
---------------
Scheme is a programmable programming language ! I heard it through the grapevine !