C'est du postgresql mais ça doit être la même

Résolu/Fermé
edilecachan Messages postés 87 Date d'inscription dimanche 1 janvier 2012 Statut Membre Dernière intervention 26 juin 2023 - Modifié par jee pee le 30/03/2013 à 11:32
edilecachan Messages postés 87 Date d'inscription dimanche 1 janvier 2012 Statut Membre Dernière intervention 26 juin 2023 - 30 mars 2013 à 00:00
Bonjour,

Quelqu'un pourrait-il m'expliquer le fonctionnement de PostGreSQL suivant et éventuellement me donner une solution :

Je lance cette requête :

create temp sequence q;
select NoRole, Role
from (select nextval('q') as NoRole, refval as Role
from (select refval, refpos
from refvalues
where reftabid = (select tabid from tables where tabradical = 'Rol') order by refpos) as TRole) as TabRole;

J'obtiens quelque chose comme ça :

*---------------*---------------*
! NoRole ! Role !
*---------------*---------------*
! 1 ! TOTO !
! 2 ! TITI !
. . .
. . .
. . .
! n ! POUET !
. . .
. . .
. . .


Maintenant ce qui m'intéresse c'est le n correspondant à POUET, alors, j'écris ça en rajoutant un WHERE :

create temp sequence q;
select NoRole, Role
from (select nextval('q') as NoRole, refval as Role
from (select refval, refpos
from refvalues
where reftabid = (select tabid from tables where tabradical = 'Rol') order by refpos) as TRole) as TabRole
where Role = 'POUET';

Et, là, horreur, malheur, j'obtiens :

*---------------*---------------*
! NoRole ! Role !
*---------------*---------------*
! 1 ! POUET !
*---------------*---------------*

Un fichu 1 en lieu et place du n attendu.

Maman bobo, au secours ....

Amitiés et cordialement, Henri

P.S. : Désolé, j'avais fait des petits tableaux, mais, l'éditeur de texte me tasse les espaces. S'il y a une solution, je suis preneur ...
A voir également:

1 réponse

edilecachan Messages postés 87 Date d'inscription dimanche 1 janvier 2012 Statut Membre Dernière intervention 26 juin 2023 3
30 mars 2013 à 00:00
Alléluia mes frères,

En continuant mes recherches sur google, j'ai ouvert une une page de PostGreSQL sur une note de release concernant la 8.4, j'ai trouvé quelques mots clefs, qui, mis bout à bout donne le résultat attendu. Je vous la livre :

WITH tab_role as (select RANK() OVER (w) AS rang_role, refval as role

from refvalues

where reftabid = (select tabid from tables where tabradical = 'Rol')

WINDOW w AS (PARTITION BY reftabid ORDER BY refpos asc))

select tab_role.rang_role, tab_role.role

from tab_role

where tab_role.role = 'POUET'

RESULTAT (on note le n et on se souvient religieusement du 1)

*---------------*---------------*
! NoRole ! Role !
*---------------*---------------*
! n ! POUET !
*---------------*---------------*

Il semblerait que le WITH force le gestionnaire à créer un tableau de travail en vue de sa réutilisation à répétition dans la requête qui suit.

Le RANK, lui, assure la numérotation.

Le WINDOW fait le découpage de la table refvalues sur la valeur refval triée sur refpos

Grâce au WITH, on échappe à ce qu'ILS appellent le SQLoptimiser (je me marre, AH AH AH !!!)
0