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

SQL Oracle Discussion :

requete qui marche mais que jaimerai beaucoup simplifier :-(


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Femme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Points : 17
    Points
    17
    Par défaut requete qui marche mais que jaimerai beaucoup simplifier :-(
    J'ai deux tables:
    - announcements
    . announcement_id
    . date_begin
    . date_exp
    . sujet

    - announcement_user
    . announcement_id
    . user_id
    . is_deleted

    Qd le user se connecte, il accede directement a la page d'annonces avec la liste des annonces actives qu'il n'a pas efface lui meme. Et c'est unique;ent quand il se connecte a la page d'annonce qu'on ajoute les lignes dans la table annonce_user.
    En gros, ca veut dire que y a pas de ligne dans la table user s'il n'est pas entre dans le site encore. C'est ce qui me complique la vie.
    Bref, je veux sortir la liste des annonces actives qu'il n'a pas efface. et J'y arrive pas.

    J'ai cette requete qui marche pour le moment (le 735, je l'ai impose en dur, parce que j'aurai l'id du user a partir du site, donc on peut laisser je pense).

    select id, sub, is_deleted, user_id
    from (select ANN.announcement_id id, ANN.subject sub, ANN.body, nvl(TAB.is_deleted, 0) is_deleted, 735 as user_id
    from (select announcement_id, 735 as user_id, is_deleted
    from announcement_user
    where user_id = 735
    ) TAB, announcements ANN
    where ANN.announcement_id = TAB.announcement_id (+)
    and date_begin <= sysdate
    and sysdate <= date_exp) POURVOIR
    where is_deleted = 0


    mais je crois que je me complique la vie... y a moyen de simplifier????

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Si j'ai bien compris la situation alors voici deux possibilités où :user_id est l'identifiant fourni par l'application (735 dans votre exemple)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    select ...
    from announcements a, announcement_user u
    where a.announcement_id = u.announcement_id (+)
      and 0 = u.is_deleted (+)
      and :user_id = u.user_id (+)
      and sysdate between a.date_begin and a.date_exp
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select ...
    from announcements a left join announcement_user u
    on    a.announcement_id = u.announcement_id
          and
          0 = u.is_deleted
          and
          :user_id = u.user_id
    where sysdate between a.date_begin and a.date_exp

  3. #3
    Membre à l'essai
    Femme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2007
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2007
    Messages : 18
    Points : 17
    Points
    17
    Par défaut ca marche!!!
    Effectivement, j'ai pu utiliser votre requete,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT ...
    FROM announcements a, announcement_user u
    WHERE a.announcement_id = u.announcement_id (+)
      AND 0 = u.is_deleted (+)
      AND :user_id = u.user_id (+)
      AND sysdate BETWEEN a.date_begin AND a.date_exp
    Je savais pas qu'on pouvait mettre les (+) sur tous les champs, c'est ce qui a bloque mon raisonnement....

    Un GRAND GRAND MERCI :-)

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Vaut mieux utiliser l'écriture ANSI maintenant qu'Oracle le supporte parce que tous les SGBD tendent vers cette norme

  5. #5
    Membre chevronné Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Points : 2 071
    Points
    2 071
    Par défaut
    Je savais pas qu'on pouvait mettre les (+) sur tous les champs, c'est ce qui a bloque mon raisonnement.
    Non seulement on peut, mais ON DOIT le faire , sinon les résultats de la jointure externe sont pour le moins erratiques !

  6. #6
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par orafrance Voir le message
    Vaut mieux utiliser l'écriture ANSI maintenant qu'Oracle le supporte parce que tous les SGBD tendent vers cette norme
    à la rigueur, mais l'écriture ANSI a beaucoup plus de bugs, même en 10gR2. Elle est également à éviter par exemple si l'on crée une vue matérialisée de type Fast-Refreshable.

  7. #7
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Je ne savais pas Toujours est-il qu'il faut commencer à sérieusement la maitriser (ce qui n'est pas mon cas ) parce qu'il semble qu'Oracle finisse par l'imposer

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    en tout cas aucune vue interne ne l'employe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select text from  dba_views where view_name='ALL_TABLES' ;
    select 
     ...
    from
     ...
    where
      t.bobj# = co.obj# (+) 
    ...

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    Il se dit que la 12 n'acceptera plus le (+) mais j'suis pas sûr que ce soit officiel

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    en tout cas aucune vue interne ne l'employe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    select text from  dba_views where view_name='ALL_TABLES' ;
    select 
     ...
    from
     ...
    where
      t.bobj# = co.obj# (+) 
    ...
    Il y a aussi des vues qui utilisent le hint /*+ RULE */ dans 10gR2 ...

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Michel SALAIS Voir le message
    Il y a aussi des vues qui utilisent le hint /*+ RULE */ dans 10gR2 ...
    Bien entendu !

  12. #12
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Il y a une grande différence cependant entre /*+RULE*/ et (+)

    Si le RBO est supprimé dans une prochaîne version, alors /*+RULE*/ sera sans effet. En aucun cas le résultat de la requête ne peut changer (sinon c'est un bug de prio 1).

    Si le (+) était supprimé, alors toutes les requêtes qui employent (+) se planteraient ou retournerait de mauvais résultats.

    Je peux sans trop de risque de mon tromper que le + ne sera jamais supprimé. Au pire plus supporté (dans 10 ans), mais supprimé jamais.

    A mon humble avis...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 354
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par laurentschneider Voir le message
    Il y a une grande différence cependant entre /*+RULE*/ et (+)

    Si le RBO est supprimé dans une prochaîne version, alors /*+RULE*/ sera sans effet. En aucun cas le résultat de la requête ne peut changer (sinon c'est un bug de prio 1).

    Si le (+) était supprimé, alors toutes les requêtes qui employent (+) se planteraient ou retournerait de mauvais résultats.

    Je peux sans trop de risque de mon tromper que le + ne sera jamais supprimé. Au pire plus supporté (dans 10 ans), mais supprimé jamais.

    A mon humble avis...
    Bien sûr nous ne pouvons pas comparer les deux. Mais je signalais qu'Oracle continue à utiliser en interne le hint /*+ RULE */ tout en déconseillant son utilisation.

    Personnellemnt, je n'aime pas du tout la syntaxe "inner join" et je préfère la liste des tables séparées par des virgules. Concernant la jointure externe je préfère, par contre, la nouvelle syntaxe qui permet des choses que le (+) ne peut pas exprimer. Même si cette syntaxe a encore des bugs comme tu l'as bien signalé.

    En ce qui concerne le "maintien" de la syntaxe (+) je crois que tu as raison ...

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

Discussions similaires

  1. Requete qui marche une fois mais pas deux
    Par maxvador dans le forum Hibernate
    Réponses: 4
    Dernier message: 23/01/2007, 15h07
  2. [MySQL] Order by qui marche pas, Que faire ?
    Par mulbek dans le forum PHP & Base de données
    Réponses: 25
    Dernier message: 06/01/2006, 14h48
  3. Code qui marche, mais pas la mise à jour
    Par Cablan dans le forum Access
    Réponses: 7
    Dernier message: 24/10/2005, 17h09
  4. Script qui marche mais pas elegant[newbie]
    Par billybob2006 dans le forum Langage
    Réponses: 4
    Dernier message: 21/10/2005, 12h25
  5. [PL/SQL] requete qui marche mais pas dans un cursor
    Par victor.ward dans le forum Langage SQL
    Réponses: 3
    Dernier message: 09/09/2005, 22h21

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