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 :

Merge sur deux tables


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut Merge sur deux tables
    Bonjour,

    j'ai deux tables dans lesquelles je peux avoir les informations suivantes :

    T1
    id | value1
    1 1
    2 1
    4 1

    T2
    id | value2
    1 1
    3 1

    Je souhaite récupérer le résultat suivant


    id | value1 | value2
    1 1 1
    2 1 0
    3 0 1
    4 1 0

    La jointure externe ne fonctionnera pas puisqu'elle excluera l'id de l'autre table.

    Merci pour votre aide.

    Pour info j'aurais utiliser un MERGE mais je trouve que c'est lourd, et ce que je souhaite me parait un cas commun ou bien un UNION sur les deux tables en WITH avec un select en main, mais pareil ça me parait tuer une mouche avec une masse.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Citation Envoyé par shadeoner Voir le message
    La jointure externe ne fonctionnera pas puisqu'elle excluera l'id de l'autre table.
    Ah bon ? Chez moi elle fonctionne très bien :
    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
    WITH T1 AS
    (
    select 1 id, 1 val1 from dual union all
    select 2, 1 from dual union all
    select 4, 1 from dual
    ), T2 AS
    (
    select 1 id, 1 val2 from dual union all
    select 3, 1 from dual
    ) 
    select
        coalesce(T1.id, T2.id) id,
        coalesce(T1.val1, 0) val1,
        coalesce(T2.val2, 0) val2
    from
        T1 FULL OUTER JOIN T2 ON T2.id = T1.id
    order by
        coalesce(T1.id, T2.id) asc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID	VAL1	VAL2
    1	1	1
    2	1	0
    3	0	1
    4	1	0

  3. #3
    Membre expérimenté
    Inscrit en
    Janvier 2009
    Messages
    162
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 162
    Par défaut
    Bonjour,

    Une solution peut être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select t1.id,nvl(t1.v1,0),nvl(t2.v1,0) from t1 left outer join t2 on t1.id=t2.id 
    union 
    select t2.id,nvl(t1.v1,0),nvl(t2.v1,0) from t2 left outer join t1 on t2.id=t1.id 
    order by id;

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Ah bon ? Chez moi elle fonctionne très bien :
    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
    WITH T1 AS
    (
    select 1 id, 1 val1 from dual union all
    select 2, 1 from dual union all
    select 4, 1 from dual
    ), T2 AS
    (
    select 1 id, 1 val2 from dual union all
    select 3, 1 from dual
    ) 
    select
        coalesce(T1.id, T2.id) id,
        coalesce(T1.val1, 0) val1,
        coalesce(T2.val2, 0) val2
    from
        T1 FULL OUTER JOIN T2 ON T2.id = T1.id
    order by
        coalesce(T1.id, T2.id) asc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ID	VAL1	VAL2
    1	1	1
    2	1	0
    3	0	1
    4	1	0
    Hello,

    tu utilises un full outer join, existe-t-il une écriture identique avec le (+) ?

  5. #5
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Non, si vous utilisez ces affreux vilains horribles (+), il vous faudra utiliser la solution de Mathias : T1(+)=T2 union T1=T2(+).

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    401
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 401
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Non, si vous utilisez ces affreux vilains horribles (+), il vous faudra utiliser la solution de Mathias : T1(+)=T2 union T1=T2(+).
    C'est pourtant l'écriture d'origine D'Oracle

    Merci pour l'aide je fais des tests

  7. #7
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Quite a utiliser des choses vilaines et horribles ....

    la solution with clause ici est valable pour quelques lignes ...

    mais si t'as 100000 lignes dans T1
    et autant dans T2

    autant faire la solution UNION

    ou

    Code sql : 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
     
    WITH VAL1 AS
    (
    select id,value from T1
    ), VAL2 AS
    (
    SELECT id,value from T2
    ) 
    SELECT
        coalesce(VAL1.id, VAL2.id) id,
        coalesce(VAL1.value, 0) RES1,
        coalesce(VAL2.value, 0) RES2
    FROM
        VAL1 FULL OUTER JOIN VAL2 ON VAL2.id = VAL1.id
    ORDER BY
        coalesce(VAL1.id, VAL2.id) ASC;

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

Discussions similaires

  1. Requete sur deux tables
    Par ReaseT dans le forum ASP
    Réponses: 13
    Dernier message: 07/02/2005, 16h18
  2. Cumul sur deux tables
    Par lper dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/11/2004, 15h02
  3. Comptez sur deux tables en même temps
    Par genova dans le forum Langage SQL
    Réponses: 12
    Dernier message: 13/09/2004, 18h58
  4. trigger sur deux tables
    Par Shabata dans le forum Développement
    Réponses: 4
    Dernier message: 04/05/2004, 16h55
  5. 2 Count() sur deux tables en jointures gauches
    Par Alexandre T dans le forum Langage SQL
    Réponses: 2
    Dernier message: 03/09/2003, 16h53

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