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 :

Gestion de la performance


Sujet :

SQL Oracle

  1. #1
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut Gestion de la performance
    Bonjour,

    Je voudrais savoir quelle est la meilleure façon de faire pour vérifier par exemple si un contrat de la tableA exitse dans la tableB.
    La clé commune aux deux tables (id_contrat).

    Merci!

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    créer une foreign key si ça présence est obligatoire

    Sinon,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM TableA
    WHERE id_contrat NOT IN (SELECT  id_contrat FROM TableB)
    Ou

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT * FROM TableA A
    WHERE NOT EXISTS (SELECT 1 FROM TableB B WHERE A.id_contrat=B.id_contrat)

  3. #3
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Merci pour la réponse mais est-il possible de mettre en place une jointure classique pour la même requête et si non pourquoi ?

    Merci!

  4. #4
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Une dernière chose si possible!

    Je dois exécuter une requête
    qui m'affiche les contrats de la table A (id_contrat)
    qui existent dans la table B (id_contrat) et
    qui ont un statut (statut <>'d') dans la table C (id_contrat, statut) et
    qui ne sont pas dans la table D (id_contrat)

    Merci!

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    C'est pour vos exercices de cours ?

  6. #6
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    J'aimerai pouvoir supprimer le dernier commentaire car c'était juste pour vous préciser mais pas pour le public svp!

  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 : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par Jinkas Voir le message
    Une dernière chose si possible!

    Je dois exécuter une requête
    qui m'affiche les contrats de la table A (id_contrat)
    qui existent dans la table B (id_contrat) et
    qui ont un statut (statut <>'d') dans la table C (id_contrat, statut) et
    qui ne sont pas dans la table D (id_contrat)

    Merci!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT * FROM TableA A INNER JOIN TableB B ON A.id_contrat=B.id_contrat
    WHERE statut <> 'd'
    AND NOT EXISTS (SELECT 1 FROM TableC C WHERE A.id_contrat=C.id_contrat)

  8. #8
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Désolé la requête ne fonctionne pas mais aussi la table D n'est pas utilisée.

  9. #9
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Je ne sais pas si je me suis mal fait comprendre pour la requête. Mais ce que je cherche à faire c'est de pouvoir afficher tous les contrats de la table A qui existent dans la table B et qui ont un statut différent de 'd' et que le statut est défini dans une table C et qui contient aussi l'id du contrat et enfin que les contrats à afficher n'appartiennent pas à la table D.
    J'ai vraiment besoin de pouvoir afficher ça et de la meilleure façon surtout pour une meilleure performance de la requête et ça me permettra de mieux comprendre pour la prochaine fois.

    Merci d'avance!

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Ouais enfin, faudrait pas trop pousser non plus, t'as le droit de chercher à extrapoler avec les exemples que j'ai donné

  11. #11
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    J'aimerai savoir si ma requête est correcte par rapport à ce que je cherche à faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *
    FROM tableA A 
    INNER JOIN tableB B ON A.id_contrat=B.id_contrat
    INNER JOIN tableC C ON (A.id_contrat=C.id_contrat AND C.STATUT <> 'd')
    AND NOT EXISTS (SELECT 1 FROM tableD D WHERE A.id_contrat=D.id_contrat)
    Merci!

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Ca parait bon

  13. #13
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Non pas vraiment

    Ca dépend des cardinalités de vos associations.
    Si pour une ligne de TableA vous avez une ligne dans TableB, une ligne dans TableC où le statut n'est pas à 'd', alors à une erreur de syntaxe près c'est correct (remplacez le dernier AND par un WHERE).

    Si vos cardinalités sont (1, n), votre requête renverra des doublons.

    Il faudra alors écrire soit :
    Soit écrire uniquement avec des EXISTS / NOT EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT *
      FROM tableA A
     WHERE EXISTS (SELECT NULL FROM tableB B WHERE A.id_contrat = B.id_contrat)
       AND EXISTS (SELECT NULL FROM tableC C WHERE A.id_contrat = C.id_contrat AND C.STATUT <> 'd')
       AND NOT EXISTS (SELECT NULL FROM tableD D WHERE A.id_contrat = D.id_contrat)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    c'est quoi la différence entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT *
      FROM tableA A
     WHERE EXISTS (SELECT NULL FROM tableB B WHERE A.id_contrat = B.id_contrat)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT *
      FROM tableA A INNER JOIN tableB B ON A.id_contrat = B.id_contrat

  15. #15
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Différence en nombre de lignes et de colonnes :
    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
    With TableA AS
    (
    select 1 as id_contrat from dual
    )
      ,  TableB AS
    (
    select 1 as id_contrat from dual union all
    select 1               from dual 
    )
    SELECT *
      FROM tableA A
     WHERE EXISTS (SELECT NULL FROM tableB B WHERE A.id_contrat = B.id_contrat);
     
    ID_CONTRAT
    ----------
             1
    1 row selected.
    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
    With TableA AS
    (
    select 1 as id_contrat from dual
    )
      ,  TableB AS
    (
    select 1 as id_contrat from dual union all
    select 1               from dual 
    )
    SELECT *
      FROM tableA A
           INNER JOIN tableB B
             ON A.id_contrat = B.id_contrat;
     
    ID_CONTRAT ID_CONTRAT_1
    ---------- ------------
             1            1
             1            1
    2 rows selected.

  16. #16
    Membre du Club
    Inscrit en
    Août 2009
    Messages
    273
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 273
    Points : 46
    Points
    46
    Par défaut
    Merci pour vos réponses mais avec les deux requêtes de orafrance j'ai les même résultats.

Discussions similaires

  1. gestion des données statiques / performance
    Par citizen_walker dans le forum JPA
    Réponses: 1
    Dernier message: 17/03/2008, 17h14
  2. Réponses: 9
    Dernier message: 20/03/2007, 19h56
  3. [SOLARIS] Gestion de la performance
    Par bilelle dans le forum Solaris
    Réponses: 1
    Dernier message: 09/10/2006, 13h31

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