Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 13/02/2007, 15h22   #1
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 2
Points : 2
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 :
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.
Diazz5475 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 15h38   #2
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Code :
1
2
3
4
 
... 
FROM facture LEFT JOIN horaire
ON (FACTURE_PERIODE.DATEDEBUT  BETWEEN HORAIRE.DEBUT AND HORAIRE.FIN)
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 16h33   #3
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 2
Points : 2
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 ?
Diazz5475 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 16h38   #4
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
dans ton from

sinon tu peux utiliser la syntaxe Oracle8 where datedebut(+) between db and fn
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 16h49   #5
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 2
Points : 2
J'ai essayé ca
Code :
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
Diazz5475 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 17h12   #6
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
Code :
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 :
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
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 17h23   #7
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 2
Points : 2
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

Diazz5475 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 17h41   #8
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
... la nouvelle Syntaxe offre plus de fléxibilité.

Quelle est ta requête?
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 18h06   #9
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 2
Points : 2
je peux te l'envoyer en mp ? parceque je ne veux pas qu'elle figure dans un forum
Diazz5475 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/02/2007, 20h09   #10
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
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
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 12h08   #11
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
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 :
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 :
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 :
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 :
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 :
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
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 13h04   #12
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 2
Points : 2
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
Diazz5475 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 13h07   #13
Invité de passage
 
Inscription : février 2007
Messages : 11
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 11
Points : 2
Points : 2
okay j'ai trouvé pourquoi
j'attends le résultat de la requête mais ca parait plus long c normal ?
Diazz5475 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/02/2007, 13h44   #14
Expert Confirmé Sénior


 
Avatar de laurentschneider
 
Homme Laurent Schneider
Administrateur de base de données
Inscription : décembre 2005
Messages : 2 927
Détails du profil
Informations personnelles :
Nom : Homme Laurent Schneider
Localisation : Suisse

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

Informations forums :
Inscription : décembre 2005
Messages : 2 927
Points : 4 549
Points : 4 549
ç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
laurentschneider est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 02h19.


 
 
 
 
Partenaires

Hébergement Web