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

Langage SQL Discussion :

Problème de création de vue.


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Juin 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 65
    Par défaut [Résolu] Problème de création de vue.
    Bonjour à tous,
    Je continue mon apprentissage (dans la douleur) de SQL.

    Je travaille en SQL2, sous HSQLDB.

    Voici les tables que je crée :
    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
     
    CREATE TABLE users(
     id INTEGER IDENTITY, //équivalent à autoincrement PK
     login VARCHAR(50),
     password VARCHAR(20),
     name VARCHAR(50),
     gender VARCHAR(6),
     preferred_language VARCHAR(2),
     profile VARCHAR(7),
     preferred_character VARCHAR(10),
     CONSTRAINT uniq_users UNIQUE (login),
     CONSTRAINT valid_users_character CHECK(preferred_character IN ('mayday','frog')),
     CONSTRAINT valid_users_profile CHECK(profile IN ('student','admin')),
     CONSTRAINT valid_users_gender CHECK(gender IN ('male','female')));
     
    CREATE TABLE sessions(
     id INTEGER IDENTITY,
     user INTEGER,
     date DOUBLE,
     duration DOUBLE,
     CONSTRAINT fk_sessions_users FOREIGN KEY (user) REFERENCES users(id) ON DELETE CASCADE,
     CONSTRAINT valid_sessions_date CHECK(date>0),
     CONSTRAINT valid_sessions_duration CHECK(duration>=0)
    );
     
    CREATE TABLE tentatives(
     id INTEGER IDENTITY,
     session INTEGER,
     experiment VARCHAR(10),
     date DOUBLE,
     duration DOUBLE,
     score DOUBLE,
     status VARCHAR(10),
     location VARCHAR(255),
     CONSTRAINT fk_tentatives_sessions FOREIGN KEY (session) REFERENCES sessions(id) ON DELETE SET NULL,
     CONSTRAINT valid_score CHECK(score>=0 AND score<=100),
     CONSTRAINT valid_tentatives_date CHECK(date>0),
     CONSTRAINT valid_tentatives_duration CHECK(duration>=0),
     CONSTRAINT valid_tentatives_status CHECK(status IN ('passed','completed','failed','incomplete','browsed'))
    );
    Ce que je veux obtenir c'est :
    pour chaque user, obtenir tous les experiment, avec la location la plus récente lui correspondant.

    Voici l'état de mes tables :
    USERS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    ID  LOGIN        PASSWORD   NAME          GENDER  PREFERRED_LANGUAGE  PROFILE  PREFERRED_CHARACTER
    --  -----------  ---------  ------------  ------  ------------------  -------  -------------------
     0  login        mdp        nom           male    fr                  student  mayday
     3  login2       password2  christine-2   female  es                  admin    frog
     5  log          password2  edouard baer  male    no                  admin    mayday
     9  miaou        password2  edouard baer  male    no                  admin    mayday
    10  miaou22      password2  edouard baer  male    no                  admin    mayday
    12  miaou223     password2  edouard baer  male    no                  admin    mayday
    15  miaou2234    password2  edouard baer  male    no                  admin    mayday
    18  miaou22345   password2  edouard baer  male    no                  admin    mayday
    19  miaou223456  password2  edouard baer  male    no                  admin    mayday
    SESSIONS
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ID  USER  DATE          DURATION
    --  ----  ------------  --------
     0     0  10.0          26568.0
     1     0  100.0         26568.0
     2     0  1245.0        26568.0
    14     9  1451212.0     45789.0
    15     9  2457889.0     89.0
    16     9  35.0          89457.0
    20     3  458.0         45693.0
    21     3  458458.0      45693.0
    22     3  1.0           45693.0
    23    10  7.89454875E8  1256.0
    TENTATIVES
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    ID  SESSION  EXPERIMENT  DATE           DURATION  SCORE  STATUS     LOCATION
    --  -------  ----------  -------------  --------  -----  ---------  ------------
     
     1        2  a12         10.0           12.0      75.8   passed     location
     2        2  b1          45687.0        12.0      75.8   passed     location2
     3       21  c125        1054.0         12.0      75.8   passed     location-3
     4       15  n7          1054792.0      12.0      75.8   passed     location4
     5       23  d4          8.5693215E7    1248.0    20.63  failed     ici
     6       16  p26         4.5987613E7    12345.0   1.26   completed  maLocation
     7       14  p26         1.245987613E9  12345.0   1.26   failed     maLocation22
     
     8        2  p26         7712459.0      7812.0    58.3   completed  maLoc
     9        2  p27         124583.0       7812.0    58.3   completed  parla
    Voici donc le résultat auquel je voudrais parvenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    USER  SESSION  EXPERIMENT  LOCATION      DATE
    ----  -------  ----------  ------------  -------------
       0        2  a12         location      10.0
       0        2  b1          location2     45687.0
       0        2  p26         maLoc         7712459.0
       0        2  p27         parla         124583.0
       9       14  p26         maLocation22  1.245987613E9
       9       15  n7          location4     1054792.0
       3       21  c125        location-3    1054.0
      10       23  d4          ici           8.5693215E7
    Pour le moment, le meilleur résultat auquel je parviens est le suivant : (vue nommée "locations")
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    USER  SESSION  EXPERIMENT  LOCATION      DATE
    ----  -------  ----------  ------------  -------------
       0        2  a12         location      10.0
       0        2  b1          location2     45687.0
       0        2  p26         maLoc         7712459.0
       0        2  p27         parla         124583.0
       9       14  p26         maLocation22  1.245987613E9
       9       15  n7          location4     1054792.0
       9       16  p26         maLocation    4.5987613E7 <-- la ligne en trop !
       3       21  c125        location-3    1054.0
      10       23  d4          ici           8.5693215E7
    Pour cela, je crée la vue tq :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CREATE VIEW locations AS
        SELECT r.user AS user, t.session AS session, t.experiment AS experiment, t.location AS location, t.date AS date FROM sessions r 
            INNER JOIN tentatives t ON t.session=r.id;
    Théoriquement, si je faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM locations r WHERE r.date=(SELECT MAX(s.date) FROM locations s WHERE s.experiment=r.experiment);
    je devrais m'en sortir.

    le problème est que HSQLDB ne veut pas de cette dernière requête.

    qqn aurait une idée ?

  2. #2
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Tu peux peut-être essayer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select   *
    from     LOCATION r
    where    r.date in (
                select   max(s.date)
                from     LOCATION s
                where    s.experiment = r.experiment
             )

    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2004
    Messages
    65
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 65
    Par défaut
    merci bcp de m'avoir mis sur la voie .... jamais je n'aurais pensé à mettre le mot clé IN. D'ailleurs, quelle est la différence fondamentale ?

    en tout cas, voici la requête qui renvoie le résultat escompté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * FROM locations r
                WHERE r.date IN (
                            SELECT MAX(s.date) FROM locations s
                            WHERE s.experiment = r.experiment AND s.user=r.user);

  4. #4
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Par défaut
    Honnêtement, sous Oracle j'aurais fais comme dans ta première requête avec le = (select ...).
    Mais je me suis douté que le = (select ...) n'était pas supporté par ton SGBD.

    Sous Oracle en tout cas, quand tu fais = (select ...) le select ne doit ramener qu'au plus une ligne. Alors que quand tu fais in (select ...) ca ne pose pas de pb si le select ramène plusieurs lignes, c'est même souvent le cas même si dans ton pb par construction on sait qu'il n'y aura qu'une seule ligne, c'était juste pour contourner cette contrainte.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

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

Discussions similaires

  1. Problème de création de vue
    Par amani1 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/01/2014, 16h34
  2. [10g] Probléme de création de VUE
    Par syrine01 dans le forum SQL
    Réponses: 1
    Dernier message: 28/09/2013, 16h35
  3. [Mysql]Problème de création de vue
    Par cwamgis dans le forum Free
    Réponses: 1
    Dernier message: 18/09/2007, 00h56
  4. Problème de création de vue
    Par valauga dans le forum Administration
    Réponses: 6
    Dernier message: 03/04/2007, 16h34
  5. Problème pour création d'une vue
    Par gapse dans le forum Oracle
    Réponses: 5
    Dernier message: 30/08/2006, 15h35

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