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

Autres SGBD Discussion :

[HSQLDB] Mise à jour d'une colonne pour une table d'indexation


Sujet :

Autres SGBD

  1. #1
    Candidat au Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut [HSQLDB] Mise à jour d'une colonne pour une table d'indexation
    Bonjour à tous,

    Nouveau sur les bases de données, je viens vers vous car au bout de 6 mois de recherche avec l'ami google, je n'ai pas trouvé de réponse.

    Voilà j'expose ma question.

    J'utilise HSQLDB via une application JAVA qui me permet de stocker et de trier des informations sur l'avancement de mon algorithme.
    Mais pour faire simple et pour l'exemple, je créé une table avec deux colonnes ( Variation et ordre) et je créé au une table d'indexation (une view) où je demande de trier les variations par ordre croissant que je limite aux dix meilleurs variations.

    CREATE TABLE Table (Variation DOUBLE, Ordre INT)
    CREATE VIEWS View AS SELECT * FROM Table WHERE Ordre IS NULL ORDER BY Variation DESC LIMIT 10

    J'aimerai attribuer un ordre de traitement dans la case ordre. C'est à dire en sélectionnant les 10 meilleurs variations via la table d'indexation et en mettant à jour la case ordre : Exemple valeur à 1 pour les 10 premiers, à 2 pour les 10 suivant, ect...

    J'ai essayé un code comme celui-ci (qui ne fonctionne pas) :
    UPDATE View SET Ordre = 1


    Or je n'ai pas l'air d'avoir la possibilité de le faire par la fonction UPDATES sur la table d'indexation

    Je vous donne mon petit code pour ceux qu'ils veulent faire des tests

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    public class TestCreateDB 
    {
      private Connection connect = null;
      private Statement statement = null;
      private ResultSet resultSet = null;
     
      public static void main(String[] args)
      {
       try 
        {
          Class.forName("org.hsqldb.jdbcDriver");
          connect = DriverManager.getConnection("jdbc:hsqldb:C:/myDB/;create=true", "SA", "");
          statement = connect.createStatement();
          String listColonne = "";
    	  try 
    	  {
    		  // Ajout de table
    		  statement.executeQuery("CREATE CACHED TABLE IF NOT EXISTS Table (Variation DOUBLE , Ordre INT)");
    		  // Ajout de table view
    		  statement.executeQuery("CREATE VIEW View AS SELECT * FROM Table WHERE Ordre IS NULL ORDER BY Variation DESC limit 10");
    		  // Ajout des 100 valeurs
    		  for(int tempValue = 0; tempValue < 100 ; tempValue++)
    		  {
    			  statement.executeQuery("INSERT INTO Table VALUES (" + String.valueOf(Math.random()) + ",)");
    		  }
    	  }
    	  catch (Exception e) 
    	  {
    	  }
        } 
        catch (Exception e) 
        {
          throw e;
        } 
        finally
        {
          close();
        }
      }
     
      private void close() {
        try 
        {
            resultSet.close();
        }
        catch (Exception e) 
        {
        }
        try 
        {
        	statement.executeQuery("SHUTDOWN");
            statement.close();
        }
        catch (Exception e) 
        {
        }
        try 
        {
            connect.close();
        } catch (Exception e) 
    	{
        }
      }
    }
    Merci par avance de vos réponse.

  2. #2
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 394
    Points
    9 394
    Par défaut
    En général , une View, c'est un truc qui est calculé à partir de plusieurs tables, et avec éventuellement des sous-totaux.

    Par exemple, j'ai une table avec toutes les commandes de mon entreprise, et j'ai une vue qui me renvoie une ligne par mois, avec le CA du mois. Si je fais un update sur la vue, ça n'a pas de sens de modifier la table d'origine.

    Quand tu fais le create View, il faut directement afficher toutes les colonnes que tu veux, tu ne peux plus les modifier ensuite.

    Avec HSQLDB, je ne sais pas si ça marche, mais dans certains langages, tu peux utiliser la pseudo-variable ROWNUM qui donne le n° de ligne.


    Si par contre tu veux modifier la table elle même (pas la vue), tu peux tenter ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update Table t1 set ordre = ( select count(*) from t2 where t2.variation <= t1.variation)
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  3. #3
    Candidat au Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update Table t1 set ordre = ( select count(*) from t2 where t2.variation <= t1.variation)
    Je dois, en effet, avoir une interprétation différente d'une view que ce qui doit être réellement défini, je creuserai plus tard ce que tu m'as expliqué.
    Pour l'instant j'essaie de comprendre le code que tu donne.

    Pour moi, je traduis cette ligne par le fais que je souhaite attribué aux "cases" Ordre de la table T1 le nombre de ligne de variation de la table T2 qui inférieur ou égal aux ligne de variation de la table T1

    Si c'est la bonne "traduction" que je donne, cela ne correspond pas à mon problème (sans vouloir te vexer)
    Pour l'instant, je continu mes recherches via les fonctions intégrés SQL, mais là en lisant la documentation HSQLDB certaines questions apparaissent, mais je n'ai pas encore fini de lire
    Merci pour ton intervention constructive

    PS : ROWNUM existe en HSQLDB

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 394
    Points
    9 394
    Par défaut
    En relisant, tu veux écrire 1 pour les 10 premières lignes, 2 pour les 10 suivantes , etc.
    Donc adaptons la requête que je proposais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update Table t1 set ordre = ( select  trunc( (count(*)+9)/10 ,  0 ) as dizaine   from t2 where t2.variation <= t1.variation)
    Sur des petits volumes, ça va marcher. En terme de performance, c'est loin d'être idéal.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  5. #5
    Candidat au Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par tbc92 Voir le message
    Sur des petits volumes, ça va marcher. En terme de performance, c'est loin d'être idéal.
    Je regarderai ce code demain, merci.
    Pour le volume de la table, j'ai pris mon exemple le plus simple possible pour ne pas interférer avec le reste. Mais pour mon application, il y aura des tables de plusieurs dizaines de millier de lignes, voir plusieurs millions.
    Alors je cherche la performance interne de la base, parce que j'ai fais plusieurs test par différente option :
    - Utilisation de la RAM : Limitation du nombre de traitement
    - Utilisation de fichier de sauvegarde : Limitation du nombre d'enregistrement (saturation d'un DD de 500 Go en 48H)
    - Utilisation d'une base de donnée via Java : Performance mauvaise car externalisation des données de la base vers Java pour le traitement (boucle while de lecture des résultats de la requête) puis traitement par réintégration à la base.

    Donc c'est pour cela que je cherche une requête intégré qui augmente la performance.
    Bonne soirée

  6. #6
    Candidat au Club
    Homme Profil pro
    autodidacte
    Inscrit en
    Juin 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Drôme (Rhône Alpes)

    Informations professionnelles :
    Activité : autodidacte

    Informations forums :
    Inscription : Juin 2017
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon j'ai essayé le code
    J'ai du modifier quelques truc mais finalement cela fonctionne, donc merci à toi.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    update t1 set ordre = ( select  1 from v1 where v1.variation = t1.variation) where ordre is null
    J'ai été obligé d'ajouter un test de non existence de valeur dans ordre de la table car lorsque je refaisais une exécution du code pour un ordre supérieur il effaçait les lignes déjà sélectionné.

    J'ai quand même une question qui reste en suspend sur ta ligne de code, c'est le mot clé AS que j'ai déjà vu dans des exemples mais dont je n'arrive pas trop à voir la définition. Es ce une attribution de valeur (au sens large) à une variable ? Peux tu m'éclairer sur cela, merci par avance

  7. #7
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 056
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 056
    Points : 9 394
    Points
    9 394
    Par défaut
    as sert à définir un alias.
    Une des utilisations, c'est ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Select sum(montant) as valeur from matable
    Et on exporte cela, dans Excel par exemple. Dans le titre de la colonne dans Excel, on va trouver le mot valeur. C'est plus sympa que d'avoir summontant ou un truc du genre.
    Il y a plein d'autres cas plus complexes où ces alias sont utiles, et souvent même indispensables.

    Selon les moteurs SQL,on peut aussi trouver ces syntaxes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Select sum(montant)  valeur from matable
    Select sum(montant)  "VALEUR" from matable
    Personnellement, je trouve que le mot as rend la requête plus facile à lire, mais c'est subjectif.

    Si tu considères le problème résolu, clique sur le bouton "Résolu".
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 10/06/2009, 10h59
  2. Police différente pour une colonne d'une ListView
    Par Médinoc dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/02/2009, 15h28
  3. [E-00] Syntaxe pour insérer une ligne ou une colonne dans une feuille
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 02/02/2009, 09h27
  4. Réponses: 4
    Dernier message: 21/02/2008, 16h44
  5. Recherche une valeur d'une cellule dans une colonne d'une autre feuille
    Par kourria dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 21/06/2007, 13h48

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