IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

[SQL] Retrouver un intervalle libre


Sujet :

PostgreSQL

  1. #1
    Membre actif Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Points : 239
    Points
    239
    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...

  2. #2
    Membre habitué Avatar de budtucker
    Profil pro
    Développeur multimédia
    Inscrit en
    Avril 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur multimédia

    Informations forums :
    Inscription : Avril 2007
    Messages : 176
    Points : 197
    Points
    197
    Par défaut
    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 !!
    Sud04

  3. #3
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  4. #4
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    ...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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  5. #5
    Membre actif Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Points : 239
    Points
    239
    Par défaut
    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...

  6. #6
    Expert éminent
    Avatar de GrandFather
    Inscrit en
    Mai 2004
    Messages
    4 587
    Détails du profil
    Informations personnelles :
    Âge : 54

    Informations forums :
    Inscription : Mai 2004
    Messages : 4 587
    Points : 7 103
    Points
    7 103
    Par défaut
    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

  7. #7
    Membre actif Avatar de Empty_body
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    681
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 681
    Points : 239
    Points
    239
    Par défaut
    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
    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...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Transact SQL] Comparer des intervales de dates
    Par jowsuket dans le forum Langage SQL
    Réponses: 5
    Dernier message: 21/05/2008, 11h25
  2. [SQL] Retrouver un mot complet dans une chaine
    Par Christophe P. dans le forum SQL
    Réponses: 21
    Dernier message: 06/09/2007, 15h16
  3. [SQL] Retrouver la valeur de DATADIR via php
    Par leumasiom dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 19/07/2007, 15h50
  4. SQL GROUP BY intervalle de date
    Par Junior_jef dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 26/04/2007, 15h53
  5. [PL/SQL] Trouver un emplacement libre!
    Par Tuizi dans le forum Oracle
    Réponses: 16
    Dernier message: 09/06/2006, 17h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo