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 19/03/2007, 21h33   #1
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2006
Messages : 24
Points : 9
Points : 9
Par défaut Problème de requête

Bonjour,

Je travaille sous oracle8i (l'université à pas encore migré à la 10g, enfin ..)

Voici mes tables

DEPARTEMENT(NUMERO_DPT, NOM_DPT)
VILLE(NUMERO_VILLE, NOM_VILLE, NOMBRE_HABITANTS_VILLE, #NUMERO_DPT_VILLE)

NOM_VILLE et NOM_DPT sont unique.

Je fais une application en Pro*C
Je dois insérer une ville donné par l'utilisateur, jusque là simple.

Mais je souhaiterais faire une requête qui me renseigne si les données que l'utilisateur a saisie sont valides, à savoir
- Le nom du département existe
- Le numéro de la ville n'existe pas déjà
- Le nom de la ville n'existe pas déjà

Ce que je pensais faire c'est de vérifié tous en une requête mais je pense que c'est iréalisable ou ca devient aussi compliqué que de diviser en 3 requêtes.

Je demande donc votre avis si je divise en 3 ou si il y a une solution.

Citation:
Je pourrais par exemple avoir une requête résultante du style
- Aucune ligne => Pas de département
- Numero ville = null => Le numero n'existe pas
- Nom ville = null => La ville n'existe pas
Merci d'avance pr l'aide
AciDation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/03/2007, 23h59   #2
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

La clé primaire de la table ville est NUMERO_VILLE et NUMERO_DPT_VILLE clé étrangère ?
Si c'est le cas il faut utiliser une jointure externe pour te ramemer les enregistrements qui participent a la relation et qui participent pas a la relation

Code :
1
2
3
SELECT d.NUMERO_DPT, d.NOM_DPT,v.NUMERO_VILLE, v.NOM_VILLE
FROM DEPARTEMENT d ,VILLE v 
WHERE d.NUMERO_DPT=v.NUMERO_DPT_VILLE (+)
cette requette va te donner
Code :
1
2
3
4
 
- Aucune ligne => Pas de département
- Numero ville = NULL => Le numero n'existe pas
- Nom ville = null => La ville n'existe pas
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 00h18   #3
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2006
Messages : 24
Points : 9
Points : 9
J'ai déjà essayé mais le problème est que l'utilisateur renseigne numero_ville et numero_dpt

Par exemple pr ca

Citation:
SELECT d.NUMERO_DPT, d.NOM_DPT,v.NUMERO_VILLE, v.NOM_VILLE
FROM DEPARTEMENT d ,VILLE v
WHERE d.NUMERO_DPT=v.NUMERO_DPT_VILLE (+) AND v.NUMERO_VILLE = 33 AND v.NOM_VILLE = 'Gironde';
Si le numéro_ville n'existe pas alors je n'aurais aucune ligne en sortie.
AciDation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 00h24   #4
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Tu as seulement oublié un petit détail, il faut suivre ta condition a la jointure externe
Code :
1
2
3
4
5
6
 
SELECT d.NUMERO_DPT, d.NOM_DPT,v.NUMERO_VILLE, v.NOM_VILLE
FROM DEPARTEMENT d ,VILLE v
WHERE d.NUMERO_DPT=v.NUMERO_DPT_VILLE (+) 
AND v.NUMERO_VILLE(+) = 33 
AND v.NOM_VILLE (+)= 'Gironde';
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 01h00   #5
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2006
Messages : 24
Points : 9
Points : 9
On est proche de la solution ..

Citation:
SELECT d.NUMERO_DPT, d.NOM_DPT, v1.NUMERO_VILLE, v2.NOM_VILLE
FROM DEPARTEMENT d, VILLE v1, VILLE v2
WHERE d.NUMERO_DPT=v1.NUMERO_DPT_VILLE (+)
AND d.NUMERO_DPT=v2.NUMERO_DPT_VILLE (+)
AND v1.NUMERO_VILLE(+) = 28
AND d.NOM_DPT(+) = 'Gironde'
AND v2.NOM_VILLE(+) = 'Arcachon';
Mais le problème de cette requête c'est qu'a cause de la jointure externe sur le numero_dpt mes villes renseignées doivent être du département saisie, sinon elles ne sont pas marquées et moi je souhaite qu'il check les villes de toute la table et non que de la jointure du département.

Car sinon en jeux d'essai en echec je peux avoir
-Le département existe
-La ville existe "Mais n'appartient pas au département précédemment cité .."
-Idem avec le numéro ville
AciDation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 01h19   #6
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour ,

Je comprends pas un chose avec cette condition tu vas afficher seulement les département qui n'ont pas de villes ou le département 'Gironde' et la ville
'Arcachon' et le numero de la ville 28
Code :
1
2
3
4
 
AND v1.NUMERO_VILLE(+) = 28
AND d.NOM_DPT(+) = 'Gironde'
AND v2.NOM_VILLE(+) = 'Arcachon';
Si tu veux voir tous les departements et vces villes il faut enlever cette condition
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 01h21   #7
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Tu peux me donner la régle de gestion entre ville et département ?
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 07h35   #8
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2006
Messages : 24
Points : 9
Points : 9
Bonjour,

Oui mais moi ce que je souhaite afficher n'a pas besoin de la liaison entre département et ville.

Ce que je souhaite afficher c'est sur 3 colonnes
(ex de saisie utilisateur : Gironde, 28, Arcachon)


Si le département Gironde n'existe pas dans la table
Aucune ligne affiché

Si le département saisie existe et que le numero_ville et le nom_ville n'existe pas
'Gironde', null, null

Si le département existe et que le numero_ville existe et le nom_ville n'existe pas
'Gironde', 28, null

Si le département existe et que le numero_ville n'existe pas et le nom_ville existe
'Gironde', null, 'Arcachon'


Et sur la requête du dessus le problème c'est que il y a la jointure entre departement et ville donc par exemple dans notre cas si l'utilisateur saisie un numero_ville ou un nom_ville qui est dans la table MAIS qui n'est pas dans le département saisie alors j'aurais null alors que la ville existe bel et bien dans la base et je devrais avoir donc son numero_ville ou son nom_ville ...


Donc je suis peut être obligé de passer par 3 requêtes finalement, non, ou il y a peut être une autre façon de former ma requête de 'vérification de saisie' ?
AciDation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 13h30   #9
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,
Tu peux m'envoyer le script de tes deux table departement et ville, pour mieux vous aider
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 15h17   #10
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Donc il te faut utiliser une FULL OUTER JOIN
Code :
1
2
3
4
5
 
SELECT d.numero_dpt, d.nom_dpt, v.numero_ville, v.nom_ville
  FROM departement d FULL OUTER JOIN ville v
   ON (d.numero_dpt =v.numero_dpt_ville)
 WHERE v.numero_ville = 33 AND v.nom_ville = 'Gironde';
Voici des liens sur les jointures externes :
http://www.trivadis.com/Images/nf9is...tcm18-7343.pdf
http://www.oreillynet.com/pub/a/netw.../fulljoin.html
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 15h40   #11
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2006
Messages : 24
Points : 9
Points : 9
Apparemment ca ne fonctionne pas, je pense que le mieux est surement de faire 3 requêtes .. :\

Voilà le script de création

Code :
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
30
31
 
CREATE TABLE DEPARTEMENTS (
    NUMERO_DPT                 NUMBER(2) NOT NULL ,
    NOM_DPT                    CHAR(32)  NOT NULL ,
    NOMBRE_ARRONDISSEMENTS_DPT NUMBER(2)     NULL ,
    NOMBRE_CANTONS_DPT         NUMBER(3)     NULL ,
    NOMBRE_COMMUNES_DPT        NUMBER(4)     NULL ,
    SUPERFICIE_DPT             NUMBER(6)     NULL ,
    NOMBRE_HABITANTS_DPT       NUMBER(7)     NULL ,
        CONSTRAINT PK_DPTS PRIMARY KEY (NUMERO_DPT) ) ;
 
COMMENT ON TABLE DEPARTEMENTS IS 'Départements';
 
CREATE UNIQUE INDEX UNICITE_NOM_DEPARTEMENT ON DEPARTEMENTS (NOM_DPT ASC) ;
 
CREATE TABLE VILLES (
    NUMERO_VILLE           NUMBER(3) NOT NULL ,
    NOM_VILLE              CHAR(32)  NOT NULL ,
    NOMBRE_HABITANTS_VILLE NUMBER(7)     NULL ,
    NUMERO_DPT_VILLE       NUMBER(2) NOT NULL ,
        CONSTRAINT PK_VILLES PRIMARY KEY (NUMERO_VILLE) ) ;
 
COMMENT ON TABLE VILLES IS 'Villes';
 
CREATE INDEX I_FK_VILLES_DEPARTEMENTS ON VILLES (NUMERO_DPT_VILLE ASC) ;
 
CREATE UNIQUE INDEX UNICITE_NOM_VILLE ON VILLES (NOM_VILLE ASC) ;
 
ALTER TABLE VILLES ADD (
    CONSTRAINT FK_VILLES_DEPARTEMENTS
        FOREIGN KEY (NUMERO_DPT_VILLE) REFERENCES DEPARTEMENTS (NUMERO_DPT)) ;
Merci de prendre part à mon problème
AciDation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 16h27   #12
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Tu peux me donner le contenu de la table departement et ville ?
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 20h42   #13
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2006
Messages : 24
Points : 9
Points : 9
Biensur, voici

Code :
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
30
31
32
33
34
35
-- DEPARTEMENTS
 
INSERT INTO DEPARTEMENTS VALUES ( 9 , 'Corse-du-Sud' ,    2 ,   22 ,  124 ,  4014 ,  118593 ) ;
INSERT INTO DEPARTEMENTS VALUES ( 6 , 'Gironde'      ,    5 ,   63 ,  542 , 10000 , 1287334 ) ;
INSERT INTO DEPARTEMENTS VALUES ( 2 , 'Guadeloupe'   ,    3 ,   43 ,   34 ,  1703 ,  438820 ) ;
INSERT INTO DEPARTEMENTS VALUES ( 4 , 'Haute-Corse'  ,    3 ,   30 ,  236 ,  4666 ,  141603 ) ;
INSERT INTO DEPARTEMENTS VALUES ( 3 , 'Martinique'   , NULL , NULL , NULL ,  NULL ,    NULL ) ;
INSERT INTO DEPARTEMENTS VALUES ( 7 , 'Paris'        , NULL , NULL , NULL ,  NULL ,    NULL ) ;
 
commit ;
 
-- VILLES
 
INSERT INTO VILLES VALUES ( 46 , 'Ajaccio'        ,  52880 , 9 ) ;
INSERT INTO VILLES VALUES ( 28 , 'Arcachon'       ,  11459 , 6 ) ;
INSERT INTO VILLES VALUES ( 12 , 'Basse-Terre'    ,  17107 , 2 ) ;
INSERT INTO VILLES VALUES ( 37 , 'Bastia'         ,  37884 , 4 ) ;
INSERT INTO VILLES VALUES ( 44 , 'Blaye'          ,   NULL , 6 ) ;
INSERT INTO VILLES VALUES ( 20 , 'Bordeaux'       , 229500 , 6 ) ;
INSERT INTO VILLES VALUES ( 32 , 'Calvi'          ,   NULL , 4 ) ;
INSERT INTO VILLES VALUES ( 51 , 'Corte'          ,   6329 , 4 ) ;
INSERT INTO VILLES VALUES ( 57 , 'Fort-de-France' ,  94778 , 3 ) ;
INSERT INTO VILLES VALUES ( 39 , 'Gradignan'      ,  22834 , 6 ) ;
INSERT INTO VILLES VALUES ( 85 , 'La Trinité'     ,   NULL , 3 ) ;
INSERT INTO VILLES VALUES ( 41 , 'Langon'         ,   NULL , 6 ) ;
INSERT INTO VILLES VALUES ( 91 , 'Le Marin'       ,   NULL , 3 ) ;
INSERT INTO VILLES VALUES ( 72 , 'Lesparre-Médoc' ,   4855 , 6 ) ;
INSERT INTO VILLES VALUES ( 63 , 'Libourne'       ,  22457 , 6 ) ;
INSERT INTO VILLES VALUES ( 84 , 'Pessac'         ,  56851 , 6 ) ;
INSERT INTO VILLES VALUES ( 16 , 'Pointe-à-Pitre' ,  28360 , 2 ) ;
INSERT INTO VILLES VALUES ( 38 , 'Saint-Pierre'   ,   NULL , 3 ) ;
INSERT INTO VILLES VALUES ( 65 , 'Sartène'        ,   NULL , 9 ) ;
INSERT INTO VILLES VALUES ( 62 , 'Talence'        ,  38421 , 6 ) ;
 
commit ;
AciDation est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/03/2007, 23h34   #14
Rédacteur
 
Homme Salim
Développeur et DBA Oracle
Inscription : octobre 2006
Messages : 872
Détails du profil
Informations personnelles :
Nom : Homme Salim
Localisation : Canada

Informations professionnelles :
Activité : Développeur et DBA Oracle

Informations forums :
Inscription : octobre 2006
Messages : 872
Points : 1 100
Points : 1 100
Bonjour,

Tu trouveras ci-dessous la solution a ton problème :

:p_nom_dpt ----> nom du département
:p_numero_ville ----> numéro de la ville
:p_nom_ville ----> nom de la ville
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
SELECT   d.nom_dpt,  v_numero.numero_ville, v_nom.nom_ville
  FROM ( SELECT * 
         FROM departements 
         WHERE  trim(nom_dpt)=trim(:p_nom_dpt))d , 
	  ( SELECT * 
	    FROM villes 
		WHERE numero_ville=:p_numero_ville )v_numero ,
		(SELECT * 
	    FROM villes 
		WHERE trim(nom_ville)=trim(:p_nom_ville) 
		      )v_nom
   WHERE d.numero_dpt =v_numero.numero_dpt_ville(+)
    AND  d.numero_dpt=v_nom.numero_dpt_ville(+)
salim11 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2007, 20h19   #15
Invité régulier
 
Inscription : avril 2006
Messages : 24
Détails du profil
Informations personnelles :
Âge : 26

Informations forums :
Inscription : avril 2006
Messages : 24
Points : 9
Points : 9
Je te remercie,
AciDation 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 09h49.


 
 
 
 
Partenaires

Hébergement Web