probleme de jointure externe

Petit nouveau ! | 1 Messages

21 août 2012, 14:01

Bonjour à toutes et tous,

Voici les scripts de creation des tables :

CREATE TABLE dem_comment (
COMMENTID VARCHAR2(50 BYTE) NOT NULL,
PARENTID VARCHAR2(50 BYTE) NOT NULL,
DEM_DATE_CREATION_MEMO date)


CREATE TABLE demand(
NUM_PCE VARCHAR2(14 BYTE) NOT NULL,
NUM_DEMANDE VARCHAR2(8 BYTE)
)


insert into dem_comment VALUES (1,'12345ABCDEF',to_date('17/08/2012 10:18:34','DD/mm/YYyy HH:MI:SS'))

insert into demand values('12345','ABCDEF')

Et la requete qui me pose problème est la suivante

select dem.NUM_PCE, memo.parentid
from demand dem, dem_comment memo
where CONCAT(dem.NUM_PCE,dem.NUM_DEMANDE) = memo.parentId (+)
and memo.DEM_DATE_CREATION_MEMO = (select MAX(DEM_DATE_CREATION_MEMO)
FROM dem_comment memo
WHERE memo.parentId = CONCAT(dem.NUM_PCE,dem.NUM_DEMANDE))

Le résultat de l'execution de cette requete est celui que j'attend

NUMPCE | PARENTID

12345 | 12345ABCDEF


Mais lorsque je supprime l'enregistrement de la table dem_comment, je suis supposé avoir le résultat suivant (à cause de la jointure externe)

NUMPCE | PARENTID

12345 |

Mais le résultat est qu'il n'y pas d'enregistrement

NUMPCE | PARENTID



C'est comme si la jointure externe ne jouait pas son rôle

merci pour votre aide

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

21 août 2012, 17:00

Pour la jointure externe il faut utiliser LEFT JOIN ou RIGHT JOIN et éviter les relations entre tables par la méthode conditionnelle de WHERE.

Exemple:
SELECT dem.NUM_PCE, memo.parentid
FROM demand dem LEFT JOIN dem_comment memo ON CONCAT(dem.NUM_PCE,dem.NUM_DEMANDE) = memo.parentId
WHERE memo.DEM_DATE_CREATION_MEMO = (select MAX(DEM_DATE_CREATION_MEMO) from dem_comment memo2 where memo2.parentId = CONCAT(dem.NUM_PCE,dem.NUM_DEMANDE))
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

22 août 2012, 10:25

Lorsque j'execute ta requête, et que la table dem_comment est vide, il ne me donne aucun enregistrement. Or il est censé me donner

NUM_PCE | PARENTID

1245 |

Oracle ne tient pas compte non plus de la jointure externe dans ta requête

ViPHP
ViPHP | 2577 Messages

22 août 2012, 13:07

SELECT MAX(DEM_DATE_CREATION_MEMO) FROM dem_comment memo2 WHERE memo2.parentId = CONCAT(dem.NUM_PCE,dem.NUM_DEMANDE)

C'est cette partie qui pose problème puisque tu as supprimé l'enregistrement.

Peut être :
SELECT dem.NUM_PCE, memo.parentid
FROM demand dem LEFT JOIN dem_comment memo ON CONCAT(dem.NUM_PCE,dem.NUM_DEMANDE) = memo.parentId
WHERE memo.DEM_DATE_CREATION_MEMO is null or memo.DEM_DATE_CREATION_MEMO = (SELECT MAX(DEM_DATE_CREATION_MEMO) FROM dem_comment memo2 WHERE memo2.parentId = CONCAT(dem.NUM_PCE,dem.NUM_DEMANDE))