237 lignes est le résultat de "savants calculs" ratios et cie !!! et ne peux donc être changé....
Si vous pouvez le faire pour 235 , je tricherai pour les 2 manquantes !!!!!
237 lignes est le résultat de "savants calculs" ratios et cie !!! et ne peux donc être changé....
Si vous pouvez le faire pour 235 , je tricherai pour les 2 manquantes !!!!!
En essayant d'adapter l'exemple fournit par pacman (merci pacman) à ce que j'ai compris de ton schéma, je te propose cette requête :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 select arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d /*5*47=235 lignes de résultats*/ from ( select arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d, ROW_NUMBER() OVER (PARTITION BY d.exenum_d ORDER BY d.exenum_d ) as seq /*Ou mieux, order by une autre colonne plus pertinante*/ from dcpte d inner join (SELECT exenum_d FROM ( SELECT exenum_d, row_number() over (ORDER BY dbms_random.value) AS rk FROM ( SELECT distinct exenum_d FROM dcpte ) ) tmp WHERE rk <= 47 ) s on d.exenum_d=s.exenum_d ) where seq <= 5 union all select null,null,null,null,null,null,null,null,null from dual /*autant de null que de colonnes*/ /*ligne 236*/ union all select null,null,null,null,null,null,null,null,null from dual /*autant de null que de colonnes*/ /*ligne 237*/ order by exenum_d
Par contre, je pense que c'est impossible d'extraire 237 lignes (par cette technique) à cause du random (je continue à y réfléchir mais je suis de plus en plus pessimiste).
Tiens nous au courrant de ton avancement
PS : Je ne sais pas ce qui est le mieux entre une jointure et un in
Et pense à indéxer exenum_d
D'après ce qu'a dit Betty, il y a exactement 47 individus dans la table. Le random ne devrait donc pas gener (il sert même à rien je pense), si j'ai bien compris le principe.
Ca donnerai quelque chose de ce gout là, (en repompant ta requête ), en ajoutant les deux dernières lignes au hasard cette fois ci :
Ceci étant, il nous manque peut être des éléments sur les critères de sélection des lignes.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d /*5*47=235 lignes de résultats*/ FROM ( SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d, ROW_NUMBER() OVER (PARTITION BY d.exenum_d ORDER BY d.exenum_d ) AS seq /*Ou mieux, order by une autre colonne plus pertinante*/ FROM dcpte d ) WHERE seq <= 5 UNION SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d FROM ( SELECT arcref_d ,lotnum_d,rttuge_d,exenum_d ,assmac_d ,benidf_d ,tpmdri_d,entsup_d,tranrm_d, ROW_NUMBER() OVER (PARTITION BY d.exenum_d ORDER BY d.exenum_d ) AS seq FROM dcpte d INNER JOIN (SELECT exenum_d FROM ( SELECT exenum_d, row_number() over (ORDER BY dbms_random.value) AS rk FROM ( SELECT DISTINCT exenum_d FROM dcpte ) ) tmp WHERE rk <= 2 ) s ON d.exenum_d=s.exenum_d ) WHERE seq = 6
Parce que là, on récupèrera toujours les mêmes. On peut toujours ajouter une notion de random pour le champs 'seq' qui permettrait de sélectionner des lignes différentes pour chaque individu, ça ne changera pas qu'on aura toujours 5 lignes pour 45 individus, et 6 pour les 2 individus restants (avec la possibilité de récupérer un doublon si on manque de chance ).
On pourrait également envisager de ne récupérer qu'une ligne au hasard pour chaque individu, et unir le résultat avec 190 lignes récupérées au hasard dans la table (toujours en admettant qu'il y ait exactement 47 individus représentés dans la table).
Oui, on peut toujours passer par une table temporaire nous fournissant 47 individus. Mais je me demande si le '147' dans le premier post de Betty n'était pas une faute de frappe, car par la suite elle dit bien que sa table contient 47 individus.
Enfin bref, elle pourra toujours confirmer, ou pas
Au fait, j'espère qu'il y a plus de 47 individus dans la table,
parce que sinon en sélectionner 47 aléatoirement parmis 47 c'est un peu balo
Ouais, je ne pense pas que le random soit un problème.
Utilisons par exemple :
(Le hint n'est pas obligatoire, mais ça fait joli et c'est rassurant)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 WITH Prems AS ( SELECT /*+ materialize */ exenum_d, row_number() over (ORDER BY dbms_random.value) AS rk FROM ( SELECT DISTINCT exenum_d FROM dcpte ) ) tmp WHERE rk <= 47 )
A partir de ça, on peut reprendre l'idée de Snipah de faire ça en deux fois.
(La deuxième "extraction" se fait en jointure avec Prems pour ne pas reprendre les même)
(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...
Le pacblog : http://pacmann.over-blog.com/
Salut pacman,
J'avais bien pensée à l'astuce du with mais en 9i ça marche with?
Sur la mienne, c'est refusé, mais il y a peut être un truc à configurer pour pouvoir utiliser cette syntaxe.
Idem, quand je travaille sur 9i je ne peux pas utiliser le WITH, et Betty utilise 9i.
Ca marche à partir de 9R2 et Betty est en ... 9.2.0.3
(je fais le malin, mais j'avais pas fait gaffe à ce détail non plus )
(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...
Le pacblog : http://pacmann.over-blog.com/
Etrangement, j'ai la 9.2.0.4, et le WITH n'est pas reconnu
Edit : Ah si, j'ai dû m'emmêler quelque part... bien vu
Tu t'es mélangé où snipah moi j'ai
et ça marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle9i Release 9.2.0.4.0 - Production PL/SQL Release 9.2.0.4.0 - Production CORE 9.2.0.3.0 Production TNS for Linux: Version 9.2.0.4.0 - Production NLSRTL Version 9.2.0.4.0 - Production
Bah j'essayais des trucs un peu compliqués, je me faisais jeter au niveau du WITH, du coup j'ai pensé que c'était pas reconnu.
Et là pour vérifier j'ai testé un truc plus simple :
Et c'est passé. J'en déduis que le souci venait d'ailleurs que le WITH...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 WITH selection AS ( SELECT sysdate from dual ) SELECT * FROM selection
En passant, pour info :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SQL> SELECT * FROM v$version; BANNER ---------------------------------------------------------------- Oracle9i Enterprise Edition Release 9.2.0.4.0 - 64bit Production PL/SQL Release 9.2.0.4.0 - Production CORE 9.2.0.3.0 Production TNS for IBM/AIX RISC System/6000: Version 9.2.0.4.0 - Production NLSRTL Version 9.2.0.4.0 - Production
bonjour,
quelqu'un peut m'expliquer le fonctionnement de with .. as.
merci d'avance.
==========================================
La justice sans la force est impuissante, la force sans la justice est tyrannique...
Merci, en fait moi le problème c'est que ça ne marche pas via toad mais ça en marche avec sql+.
Merci à vous ça va me simplifier la vie.
Tu peux jeter un œil ici : http://sqlpro.developpez.com/cours/s...cursives/#LIII
merci snipah, je l'avais oublié celle la.
==========================================
La justice sans la force est impuissante, la force sans la justice est tyrannique...
Hop Hop, je vous arrête tout de suite avant que vous fassiez de faux espoirs : WITH peut servir pour la récursion partout sauf sur... Oracle !
(en tous cas sur la V9)
Par contre, deux points sur lesquels c'est utile :
- c'est plus joli
- si tu réutilises le résultat d'une requête
Typiquement, si tu fais des calculs sur agrégat, et que tu as besoin de faire des requêtes complexes avec les résultats : ça permet de n'exécuter qu'une seule fois la requête.
Jusqu'à la V10, ajouter le hint /*+ materialize */ assure qu'Oracle ne crée qu'une seule fois la table temporaire correspondante...
(c'est ma photo)
Paku, Paku !
Pour les jeunes incultes : non, je ne suis pas un pokémon...
Le pacblog : http://pacmann.over-blog.com/
Merci pacman pour ces précisions... surtout pour l'explication du hint
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