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

Oracle Discussion :

Oracle 9.2.0.7 - Jointure externe sur un between


Sujet :

Oracle

  1. #1
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut Oracle 9.2.0.7 - Jointure externe sur un between
    Bonjour,

    J'espère que mon message sera clair car il n'est pas facile à décrire et je ne peux pas mettre de code (il est trop immonde)

    Voilà je voudrais faire une jointure externe sur une table à travers un between. Ma date doit être contenue entre deux autres dates mais ce n'est pas obligatoire (si la jointure ne retourne rien je veux quand même récupérer mes données des autres tables).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FACTURE_PERIODE.DATEDEBUT  BETWEEN HORAIRE.DEBUT AND HORAIRE.FIN
    J'espère que vous avez compris mon soucis et que vous pourrez m'aider.

    Un grand merci d'avance.

  2. #2
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ... 
    from facture left join horaire
    on (FACTURE_PERIODE.DATEDEBUT  BETWEEN HORAIRE.DEBUT AND HORAIRE.FIN)

  3. #3
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Je n'ai pas compris la réponse :
    qu'est ce que la table periode ?
    où dois-je mettre ce code dans mon where ou à la suite du from ?

  4. #4
    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
    dans ton from

    sinon tu peux utiliser la syntaxe Oracle8 where datedebut(+) between db and fn

  5. #5
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    J'ai essayé ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FACTURE_PERIODE.DATEDEBUT  BETWEEN HORAIRE.DEBUT(+) AND HORAIRE.FIN(+)
    puisque c'est dans la table horaire où il manque des enregistrements
    mais ca ne change rien

  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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with facture_periode as (select 1 id, date '2000-01-01' datedebut from dual union all select 2,date '2002-01-01' from dual),
    horaire as (select date '2001-01-01' debut, date '2003-01-01' fin from dual)
    -- debut de la requête
    select * from facture_periode left join horaire on (datedebut between debut and fin);
     
            ID DATEDEBUT DEBUT     FIN
    ---------- --------- --------- ---------
             1 01-JAN-00
             2 01-JAN-02 01-JAN-01 01-JAN-03
    avec la syntaxe Oracle8

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    with facture_periode as (select 1 id, date '2000-01-01' datedebut from dual union all select 2,date '2002-01-01' from dual),
    horaire as (select date '2001-01-01' debut, date '2003-01-01' fin from dual)
    -- debut du select
    select * from facture_periode,horaire where datedebut between debut  (+) and fin (+)
     
            ID DATEDEBUT DEBUT     FIN
    ---------- --------- --------- ---------
             1 01-JAN-00
             2 01-JAN-02 01-JAN-01 01-JAN-03

  7. #7
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci de ta patience

    J'ai exactement la même chose que ta version 8 cepandant faut-il ajouter (+) pour les autres colonnes de la tables utilisées dans d'autres jointures ?

    Lorsque je les ajoute j'ai l'erreur oracle 01417 une table peut être de jointure externe pour une autre table au moins


  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
    ... la nouvelle Syntaxe offre plus de fléxibilité.

    Quelle est ta requête?

  9. #9
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    je peux te l'envoyer en mp ? parceque je ne veux pas qu'elle figure dans un forum

  10. #10
    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
    si tu veux, mais le mieux serait de créer un exemple reproduisible avec des CREATE TABLE et des INSERT ou alors SCOTT.EMP et SCOTT.BONUS et SCOTT.DEPT

  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
    ok, j'ai bien reçu ta requête. le problème est qu'avec la syntaxe Oracle8, il n'est pas possible de faire une jointure externe vers 2 tables. En effet, ta table Horaire joint 2 tables (Relationcontrat et Paieperiode)

    voici un exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    create table promotion as 
    select date '1981-01-01' debut, date '1981-12-31' fin, 'NEW YORK' loc, 1000 prime  from dual;
    avec emp et dept
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    select dname, sum(sal), sum(prime) 
    from dept,emp,promotion 
    where dept.deptno=emp.deptno and hiredate between debut and fin and dept.loc=promotion.loc 
    group by dname;
     
    DNAME            SUM(SAL) SUM(PRIME)
    -------------- ---------- ----------
    ACCOUNTING           7450       2000
    avec la syntax oracle8, on obtient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select dname, sum(sal), sum(prime) 
    from dept,emp,promotion 
    where dept.deptno=emp.deptno and hiredate between debut (+) and fin (+) and dept.loc=promotion.loc (+)
    group by dname;
     
    ERROR at line 3:
    ORA-01417: a table may be outer joined to at most one other table
    donc soit on fait une sous-requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select dname, sum(sal), sum(prime)
    from (
        select loc,dname,hiredate,sal from dept,emp where dept.deptno=emp.deptno) x,
        promotion
    where hiredate between debut (+) and fin (+) and x.loc=promotion.loc (+)
    group by dname;
    DNAME            SUM(SAL) SUM(PRIME)
    -------------- ---------- ----------
    RESEARCH            10875
    SALES                9400
    ACCOUNTING           8750       2000
    soit on employe la syntaxe ANSI
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    select dname, sum(sal), sum(prime)
    from
    (dept join emp using (deptno))
    left join promotion on (hiredate between debut and fin and dept.loc=promotion.loc)
    group by dname;
     
    DNAME            SUM(SAL) SUM(PRIME)
    -------------- ---------- ----------
    RESEARCH            10875
    SALES                9400
    ACCOUNTING           8750       2000

    HTH
    Laurent

  12. #12
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci pour ces explications.
    Le fait de faire une sous requete ne me plait pas, cette vue est déjà très longue.
    j'ai essayé de transformer ma requête en utilisant ANSI mais je n'ai pas trouvé de bon tutoriel sur le sujet alors en partant de ton exemple ca a donné ce que j'ai envoyé en mp
    le problème est que j'ai une erreur ora-00918 definition de colonne ambigu

  13. #13
    Futur Membre du Club
    Inscrit en
    Février 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    okay j'ai trouvé pourquoi
    j'attends le résultat de la requête mais ca parait plus long c normal ?

  14. #14
    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
    ça te parait plus long? Plus long que quoi?

    Le fait que le Outer Join prenne plus de temps que le Inner Join, c'est très possible

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

Discussions similaires

  1. ORACLE 8.1.7 pb Jointure externe
    Par gg2vig dans le forum Oracle
    Réponses: 3
    Dernier message: 18/09/2006, 14h09
  2. [DB2] Problèmes avec une Jointure externe sur des vues
    Par treivse dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/07/2006, 11h42
  3. [Oracle] Résoudre un problème de jointure externe
    Par nadass dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2006, 09h10
  4. Jointure Externe sur base ACCESS par Query Excel
    Par marie10 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 07/03/2006, 11h20
  5. Jointure externe sur 2 tables
    Par Danae dans le forum Langage SQL
    Réponses: 11
    Dernier message: 19/07/2005, 15h37

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