Précédent   Forum des professionnels en informatique > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/05/2007, 14h19   #1
Membre actif
 
Avatar de Empty_body
 
Inscription : mai 2004
Messages : 679
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 679
Points : 186
Points : 186
Par défaut [SQL] Retrouver un intervalle libre

Salut,

Dans une db j'ai un petit soucis, j'ai une table dans laquelle il y a pas mal de blancs laissé dans la numérotation des clefs et comme je dois y ajouter des groupes d'information, j'aimerais les combler... Mais comment savoir si le blanc dans la séquence de clefs est suffisant pour inserer le bloc? J'explique : j'ai par exemple ceci :
Clef valeur
1 aaa
2 bbb
3 ccc
6 ddd
15 eee
Mon premier bloc contient 4 lignes d'informations, comment puis-je savoir que je dispose d'un vide suffisant entre 6 et 15 pour insérer mes informations?
Quelqu'un aurait une idée?
Merci.
__________________
Pourquoi vouloir ré-inventer la roue...
...Surtout si c'est pour la faire carrée...
Empty_body est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/05/2007, 14h31   #2
Membre actif
 
Avatar de budtucker
 
Développeur multimédia
Inscription : avril 2007
Messages : 175
Détails du profil
Informations professionnelles :
Activité : Développeur multimédia

Informations forums :
Inscription : avril 2007
Messages : 175
Points : 174
Points : 174
Citation:
Envoyé par Empty_body
Salut,

Dans une db j'ai un petit soucis, j'ai une table dans laquelle il y a pas mal de blancs laissé dans la numérotation des clefs et comme je dois y ajouter des groupes d'information, j'aimerais les combler... Mais comment savoir si le blanc dans la séquence de clefs est suffisant pour inserer le bloc? J'explique : j'ai par exemple ceci :
Clef valeur
1 aaa
2 bbb
3 ccc
6 ddd
15 eee
Mon premier bloc contient 4 lignes d'informations, comment puis-je savoir que je dispose d'un vide suffisant entre 6 et 15 pour insérer mes informations?
Quelqu'un aurait une idée?
Merci.
En vérifiant chaque ligne et en faisant une différence entre l'occurence après et l'occurence avant à laquelle je retire 1. !! Hummmm !! galère !!
budtucker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 18h36   #3
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
Je vous propose une requête, complexe mais qui fonctionne dans tous les cas de figure, y compris si la table est vide. La table nombres est composée d'un seul champ nommé a qui contient un chiffre de la série.
Code :
1
2
3
4
5
6
7
8
9
10
SELECT COALESCE(id_disponible, 1) AS id_disponible, 1 FROM
  ((SELECT a2 + 1 AS id_disponible FROM
    (SELECT x.a AS a1, MAX(COALESCE(y.a, 0)) AS a2 FROM nombres AS x LEFT JOIN nombres AS y ON (x.a > y.a)
    GROUP BY x.a
    HAVING x.a <> MAX(COALESCE(y.a, 0)) + 1) AS z
  ORDER BY a2
  LIMIT 1)
  UNION
  SELECT MAX(a) + 1 AS id_disponible FROM nombres) AS t
LIMIT 1
Le littéral 1 dans le SELECT de plus haut niveau est une astuce forçant Postgres à renvoyer une valeur pour id_disponible même si le résultat de l'union est un ensemble vide (donc si nombres est vide).
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/05/2007, 18h46   #4
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
...et pour répondre plus précisément à la question, voici la requête, plus simple mais reprenant le même principe, qui renvoie la liste de tous les intervalles libres (si l'intervalle est réduit à un seul nombre, début = fin) :
Code :
1
2
3
4
SELECT MAX(COALESCE(y.a, 0)) + 1 AS debut, x.a - 1 AS fin FROM nombres AS x LEFT JOIN nombres AS y ON (x.a > y.a)
GROUP BY x.a
HAVING x.a <> MAX(COALESCE(y.a, 0)) + 1
ORDER BY debut
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 10h42   #5
Membre actif
 
Avatar de Empty_body
 
Inscription : mai 2004
Messages : 679
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 679
Points : 186
Points : 186
Merci à tous pour ces infos... Au risque de passer pour un c**, à quoi correspondent a,x et y, GrandFather?
__________________
Pourquoi vouloir ré-inventer la roue...
...Surtout si c'est pour la faire carrée...
Empty_body est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 10h54   #6
Expert Confirmé Sénior
 
Avatar de GrandFather
 
Inscription : mai 2004
Messages : 4 490
Détails du profil
Informations personnelles :
Âge : 42

Informations forums :
Inscription : mai 2004
Messages : 4 490
Points : 5 049
Points : 5 049
x et y ne sont que des alias pour la table nombres, ces alias sont nécessaires au moteur SQL dans le cas d'une auto-jointure pour dissiper toute ambiguïté. Quant à a, il s'agit du nom du champ contenant la clé primaire numérique. J'ai repris les mêmes termes que ceux utilisés dans le lien donné par kryskool, afin de faciliter une éventuelle étude comparative entre les deux solutions.
__________________
FAQ XML
------------
« Le moyen le plus sûr de cacher aux autres les limites de son savoir est de ne jamais les dépasser »
Giacomo Leopardi
GrandFather est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2007, 11h09   #7
Membre actif
 
Avatar de Empty_body
 
Inscription : mai 2004
Messages : 679
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 679
Points : 186
Points : 186
Je viens de tester... Et ta solution est impec... Juste un petit truc qui coinçait mais peut être lié à ma version de postgres qui est pas top à jour... Le
Citation:
AS a2 FROM nombres AS x
qui ne fonctionne que si j'enlève le AS : .
Un grand merci...
__________________
Pourquoi vouloir ré-inventer la roue...
...Surtout si c'est pour la faire carrée...
Empty_body est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h43.


 
 
 
 
Partenaires

Hébergement Web