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 :

Where exists : pourquoi le mettre ?


Sujet :

SQL Oracle

  1. #1
    Membre éclairé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Par défaut Where exists : pourquoi le mettre ?
    Salut à tous,
    je reprends un projet, contenant du SQL, et je retrouve des requêtes contenant des requêtes SQL avec la clause where exists (subquery).
    "The EXISTS condition is considered "to be met" if the subquery returns at least one row."
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    update table1 t1
    set (
    champsXX,
    champsXY
    ) =
    (select 
    champsXX,
    champsXY
    from table2 t2
    where t1.id = t2.id)
    where EXISTS(select champs
    from t2
    where t1.id = t2.id)

    Quelqu'un peut me renseigner sur l'éventuelle utilité de cette clause where exists ?

    merci d'avance,
    ben

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Sans la clause EXISTS l'update porte sur toutes les lignes de la table t1 et s'il existe des t1.id sans correspondance avec t2.id alors les colonnes XX et XY seront mises à NULL pour ces lignes (s'il n'y a pas de contrainte NOT NULL).

    Reagrde Mise à jour de données entre deux tables sous Oracle

  3. #3
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !


    Il y a cependant des restrictions sur les cas où il est possible d'utiliser cette notation. Je n'ai pas trouvé dans la doc la liste de ces cas, mais ils sont plus nombreux que les cas de restriction du MERGE.
    La doc n'est effectivement pas super précise :
    The key-preserving property of a table does not depend on the actual data in the table. It is, rather, a property of its schema. For example, if in the emp table there was at most one employee in each department, then deptno would be unique in the result of a join of emp and dept, but dept would still not be a key-preserved table.
    Tom kyte précise quant à lui :
    You NEED a primary key/unique constraint on
    object_id in T1 to ensure that each row in T joins to AT MOST 1 row in T1.
    (J'avais cité ces sources à l'époque pour mon blog )

  4. #4
    Membre éclairé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Par défaut
    Citation Envoyé par skuatamad Voir le message
    Sans la clause EXISTS l'update porte sur toutes les lignes de la table t1 et s'il existe des t1.id sans correspondance avec t2.id alors les colonnes XX et XY seront mises à NULL pour ces lignes (s'il n'y a pas de contrainte NOT NULL).

    Regarde Mise à jour de données entre deux tables sous Oracle
    Je te remercie de ta réponse claire et concise, j'en profite pour donner le code SQL que j'ai testé pour comprendre :

    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
     
    create table t1
    (
    id number,
    c1 varchar2(200),
    c2 varchar2(200)
    ) ;
     
     
    create table t2
    (
    id number,
    c1 varchar2(200),
    c2 varchar2(200)
    ) ;
     
    --t1 a des id : 1,2,3,4,5
    insert into t1 values (1,'111111','111111') ; 
    insert into t1 values (2,'111111','111111') ; 
    insert into t1 values (3,'111111','111111') ; 
    insert into t1 values (4,'111111','111111') ; 
    insert into t1 values (5,'111111','111111') ; 
     
    --t2 a des id : 1,2,3,5,6
    insert into t2 values (1,'222222','222222') ; 
    insert into t2 values (2,'222222','222222') ; 
    insert into t2 values (3,'222222','111111') ; 
    insert into t2 values (5,'222222','222222') ; 
    insert into t2 values (6,'222222','222222') ;
    UPDATE SANS LA CLAUSE EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UPDATE t1
    SET (
    c1,
    c2
    ) =
    (SELECT 
    c1,
    c2
    FROM t2
    WHERE t1.id = t2.id)
    La ligne avec l'id 4 est nulle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    --Verification du contenu des tables
    select * from t1 order by id ;
    1	222222	222222
    2	222222	222222
    3	222222	111111
    4		
    5	222222	222222


    UPDATE AVEC LA CLAUSE EXISTS :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    UPDATE t1
    SET (
    c1,
    c2
    ) =
    (SELECT 
    c1,
    c2
    FROM t2
    WHERE t1.id = t2.id)
    WHERE EXISTS(SELECT id
    FROM t2
    WHERE t1.id = t2.id)
    La ligne avec l'id 4 n' a pas été mise à jour, car elle n'existe pas dans T2 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    1	222222	222222
    2	222222	222222
    3	222222	111111
    4	111111	111111
    5	222222	222222

    Je passe en résolu,
    merci.
    à bientôt,
    ben

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

Discussions similaires

  1. SQL WHERE EXISTS
    Par maph1 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/03/2010, 21h55
  2. Fonctionnement where EXISTS ?
    Par xpander dans le forum Développement
    Réponses: 2
    Dernier message: 08/01/2009, 13h27
  3. DELETE et WHERE EXISTS
    Par jeandu69 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 18/02/2008, 10h22
  4. Besoin d'explication pour WHERE EXISTS(SELECT NULL..
    Par Mr Pink Eyes dans le forum Langage SQL
    Réponses: 3
    Dernier message: 21/06/2007, 11h22
  5. Doublon due à une sous requete WHERE EXISTS
    Par polemoss dans le forum Outils
    Réponses: 1
    Dernier message: 19/03/2007, 17h49

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