Précédent   Forum du club des développeurs et IT Pro > 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
 
Outils de la discussion
Publicité
'
Vieux 25/02/2013, 16h18   #1
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Par défaut Vérification requête SQL

Bonjour,

J'ai une requête sql, où je voudrais savoir si j'ai des erreurs ou non, enfin plutôt des erreurs de structures.
Je vous demande cela, car quand je la rentre dans mon logiciel, il met plus de 30min à l'éxécuter, et affiche un résultat de plus de 500000lignes, ou il me dis pas assez de mémoire.

Voici la requête:

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
SELECT
f.id_fam,
p.tel_perso_per,
a.adr_rue,
a.adr_ville,
a.adr_cp,
al.id_all,
m.situation_per,
p.id_per,
p.sexe_per,
p.nom_per,
p.prenom_per,
p.date_naissance_per,
il.code_lie,
il.nom_lie,
i.nom_act,
'#Date début de période ../../....#' date_debut,
'#Date fin de période ../../....#' date_fin,
count(DISTINCT date_rsv) nb_jours
FROM
cr_famille f,
cr_personne p,
cr_adresse a,
cr_allocataire al,
cr_inscription i,
cr_inscription_lieu il,
cr_inscription_presence ip,
cr_membre_famille m
WHERE
i.id_fam = f.id_fam AND
i.id_per_ins = p.id_per AND
i.id_ins = il.id_ins AND
i.id_ins = ip.id_ins AND
-- Restrcition sur la période
ip.date_rsv >= to_number(to_char(to_date('#Date début de période ../../....#'),'YYYYMMDD')) AND
ip.date_rsv <= to_number(to_char(to_date('#Date fin de période ../../....#'),'YYYYMMDD')) AND
lower(il.code_lie) = lower('#Libellé court du lieu :#') AND
--Que les présences
ip.type_heure_rsv = 'P'
GROUP BY
f.id_fam,
p.tel_perso_per,
a.adr_rue,
a.adr_ville,
a.adr_cp,
al.id_all,
m.situation_per,
p.id_per,
p.sexe_per,
p.nom_per,
p.prenom_per,
p.date_naissance_per,
il.code_lie,
il.nom_lie,
i.nom_act

Merci d'avance pour votre aide.
tifil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 16h28   #2
Pozzo
Membre actif
 
Inscription : février 2007
Messages : 181
Détails du profil
Informations forums :
Inscription : février 2007
Messages : 181
Points : 175
Points : 175
Bonjour tifil,

Essayez de formater votre code et d'utiliser les balises code ça sera plus facile à lire.

A part ça je ne vois pas de jointure sur les tables adresse, allocataire, membrefamille.
Ca veut dire que vous faites un produit cartésien sur ces tables ce qui démultiplie le résultat.
Ca peut expliquer vos soucis.

Pozzo
Pozzo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/02/2013, 16h35   #3
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Pardon, pour le code, j'ai rectifié le tir.

Quand vous dites, jointures sur ces 3 tables, pourquoi que ces 3 tables, et non les autres ?
tifil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 17h13   #4
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 013
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 013
Points : 1 533
Points : 1 533
Il n'y a aucune restriction sur ces tables.
On peut penser par exemple que l'adresse devrait être liée à la personne, que membre_famille doit être la table de jointure entre personne et famille, et que allocataire doit être liée à la personne et/ou à inscription.

En écrivant vos requêtes en jointure ANSI, vous auriez pu détecter ce problème à la source !
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/02/2013, 17h22   #5
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 876
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 876
Points : 11 750
Points : 11 750
En utilisant la notation normalisée depuis 20 ans pour les jointures, vous obtiendriez un code plus lisible et vous verriez immédiatement que les tables cr_adresse, cr_allocataire et cr_membre_famille ne sont liées à aucune autre table.
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
SELECT  f.id_fam,
        p.tel_perso_per,
        a.adr_rue,
        a.adr_ville,
        a.adr_cp,
        al.id_all,
        m.situation_per,
        p.id_per,
        p.sexe_per,
        p.nom_per,
        p.prenom_per,
        p.date_naissance_per,
        il.code_lie,
        il.nom_lie,
        i.nom_act,
        '#Date début de période ../../....#' date_debut,
        '#Date fin de période ../../....#' date_fin,
        COUNT(DISTINCT date_rsv) nb_jours
FROM    cr_inscription  i
    INNER JOIN
        cr_famille      f
        ON  i.id_fam = f.id_fam
    INNER JOIN
        cr_personne     p
        ON  i.id_per_ins = p.id_per
    INNER JOIN
        cr_inscription_lieu     il
        ON  i.id_ins = il.id_ins
    INNER JOIN
        cr_inscription_presence ip
        ON  i.id_ins = ip.id_ins
    ,   cr_adresse          a
    ,   cr_allocataire      al
    ,   cr_membre_famille   m
WHERE   -- Restrcition sur la période
        ip.date_rsv >= to_number(to_char(to_date('#Date début de période ../../....#'),'YYYYMMDD'))
    AND ip.date_rsv <= to_number(to_char(to_date('#Date fin de période ../../....#'),'YYYYMMDD'))
    AND LOWER(il.code_lie) = lower('#Libellé court du lieu :#')
        --Que les présences
    AND ip.type_heure_rsv = 'P'
GROUP BY
        f.id_fam,
        p.tel_perso_per,
        a.adr_rue,
        a.adr_ville,
        a.adr_cp,
        al.id_all,
        m.situation_per,
        p.id_per,
        p.sexe_per,
        p.nom_per,
        p.prenom_per,
        p.date_naissance_per,
        il.code_lie,
        il.nom_lie,
        i.nom_act
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises
[code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2013, 18h48   #6
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 549
Points : 13 549
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
En plus des remarques déjà relatées, quel est le type de la colonne cr_inscription_presence.date_rsv ?
Un index existe-t-il sur cette colonne ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/02/2013, 10h00   #7
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Pour répondre à al1_24, j'ai rentré votre code, et malheureusement, il met toujours plus de 30minutes à éxécuter la requête.

Pour Rei Ichido, je ne connais pas vraiment la jointure ANSI, je ne saurais donc le faire

Pour Waldar, le type est NUMBER.
tifil est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/02/2013, 11h14   #8
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 876
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 876
Points : 11 750
Points : 11 750
Je n'ai rien corrigé, j'ai simplement mis en évidence les produits cartésiens.

Pour la notation des jointures, voir ici.
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises
[code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 15h52   #9
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Voici mon nouveau code, ou j'ai jouté des jointures:

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
SELECT
t1.id_fam,
t2.tel_perso_per,
t2.prenom_per,
t2.nom_per,
t3.adr_rue,
t4.id_all,
'#Date début de période ../../....#' date_debut,
'#Date fin de période ../../....#' date_fin,
COUNT(DISTINCT date_rsv) nb_jours
FROM
cr_famille AS t1,
INNER JOIN 
	cr_personne AS t2,
INNER JOIN 
	cr_adresse AS t3,
INNER JOIN 
	cr_allocataire AS t4,
WHERE   
-- Restrcition sur la période
	ip.date_rsv >= to_number(to_char(to_date('#Date début de période ../../....#'),'YYYYMMDD'))
AND ip.date_rsv <= to_number(to_char(to_date('#Date fin de période ../../....#'),'YYYYMMDD'))
AND LOWER(il.code_lie) = lower('#Libellé court du lieu :#')
--Que les présences
AND ip.type_heure_rsv = 'P'
GROUP BY
f.id_fam,
p.tel_perso_per,
a.adr_rue,
al.id_all,
p.nom_per,
p.prenom_per
Dans les INNER JOIN, je n'ai pas de on etc... car je n'ai pas les mêmes id dans les tables.

Par contre, j'ai une petite erreur, il me dit que la commande sql ne se termine pas correctement.
tifil est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/02/2013, 15h57   #10
vttvolant
Nouveau Membre du Club
 
Homme
ingénieur d'étude PL/SQL
Inscription : octobre 2002
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : ingénieur d'étude PL/SQL

Informations forums :
Inscription : octobre 2002
Messages : 41
Points : 33
Points : 33
Code :
1
2
3
4
5
	cr_adresse as t3,
INNER JOIN 
	cr_allocataire as t4,
WHERE

tu as laissé trainer une virgule
vttvolant est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/02/2013, 15h58   #11
Rei Ichido
Membre Expert
 
Inscription : août 2009
Messages : 1 013
Détails du profil
Informations forums :
Inscription : août 2009
Messages : 1 013
Points : 1 533
Points : 1 533
Et pourtant al1_24 avait commencé à faire le boulot !
La clause ON est obligatoire après un INNER JOIN. Il faut donc la mettre - sinon, votre requête SQL ne se termine pas correctement ...

Toute la question est de savoir comment il faut faire les jointures - quelles sont les colonnes à mettre en regard, si vous préférez.
Rei Ichido est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 26/02/2013, 16h38   #12
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Dans le code de al1_24, il ya des jointures, qui selon moi sont bonnes, mais apparement, cela n'est pas correcte selon lui.

Sinon, juste après le INNER JOIN, je rajoute bien le "AS t2" non ?

Et, ça devrait être correct.
tifil est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 26/02/2013, 17h33   #13
Waldar
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 6 278
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 35
Localisation : France, Essonne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : septembre 2008
Messages : 6 278
Points : 13 549
Points : 13 549
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Oracle ne supporte pas le mot clef AS pour les alias de tables.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2013, 17h38   #14
vttvolant
Nouveau Membre du Club
 
Homme
ingénieur d'étude PL/SQL
Inscription : octobre 2002
Messages : 41
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : ingénieur d'étude PL/SQL

Informations forums :
Inscription : octobre 2002
Messages : 41
Points : 33
Points : 33
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
SELECT
t1.id_fam,
t2.tel_perso_per,
t2.prenom_per,
t2.nom_per,
t3.adr_rue,
t4.id_all,
'#Date début de période ../../....#' date_debut,
'#Date fin de période ../../....#' date_fin,
COUNT(DISTINCT date_rsv) nb_jours
FROM
cr_famille t1
INNER JOIN 
	cr_personne t2
	ON T1.<tu dois mettre la bonne colonne de jointure> = t2.<tu dois mettre la bonne colonne de jointure>
INNER JOIN 
	cr_adresse t3
	ON T3.<tu dois mettre la bonne colonne de jointure> = t<tu dois mettre la bonne TABLE de jointure>.<tu dois mettre la bonne colonne de jointure>
INNER JOIN 
	cr_allocataire t4
	ON T4.<tu dois mettre la bonne colonne de jointure> = t<tu dois mettre la bonne TABLE de jointure>.<tu dois mettre la bonne colonne de jointure>
WHERE   
-- Restrcition sur la période
	ip.date_rsv >= to_number(to_char(to_date('#Date début de période ../../....#'),'YYYYMMDD'))
AND ip.date_rsv <= to_number(to_char(to_date('#Date fin de période ../../....#'),'YYYYMMDD'))
AND LOWER(il.code_lie) = lower('#Libellé court du lieu :#')
--Que les présences
AND ip.type_heure_rsv = 'P'
GROUP BY
f.id_fam,
p.tel_perso_per,
a.adr_rue,
al.id_all,
p.nom_per,
p.prenom_per
tu ne respectes pas la syntaxe (pas de virgule et les jointures sont obligatoires)
vttvolant est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 18h49   #15
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Mais dans le ON, du INNER JOIN, si je n'ai pas le même id dans les 2 tables, comment faire ?

Par exemple, dans ma table cr_adresse, je n'ai pas d'id qui sont dans la table cr-personne ou autres.
tifil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2013, 18h57   #16
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 876
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 876
Points : 11 750
Points : 11 750
Peut-être as-tu dans ton modèle de données d'autres tables permettant d'associer les lignes de celles-ci ?
Sinon, tu entres dans ce qu'on appelle un produit cartésien : si tu as 300 lignes dans cr_personne et 400 dans cr_adresses, tu obtiendras 120000 lignes en résultat
Fais le même calcul en ajoutant deux autres tables avec 500 et 600 lignes respectivement, cela donnerait 36000000000 lignes en tout.
Je ne suis pas sur que c'est ce que tu attends !
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises
[code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2013, 16h20   #17
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Oui effectivement, j'ai pu constater cela, le résultat du produit cartésien, où j'attendais plus de 30min, pour avoir un affichage.

Je vais donc regarder, dans mon mcd, voir si j'ai pas des id identiques, et je reviendrais vers vous.
tifil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2013, 09h31   #18
tifil
 
Homme
Étudiant
Inscription : décembre 2011
Messages : 45
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2011
Messages : 45
Points : -3
Points : -3
Désolé du temps écoulés entre mon dernier message et celui-ci.
Je reviens vers vous pour une nouvelle question.

Peut-on mettre plusieurs "ON" dans un INNER JOIN ? Je m'explique.

J'ai déja déclaré via un INNER JOIN ceci: cr_famille f, ensuite j'ai mis le "ON" correspondant avec la jointure.
Mais je dois maintenant, relier une table avec cr_famille, donc une autre jointure, donc est-ce que je peut faire ceci:

Code :
1
2
3
4
INNER JOIN
                  cr_famille f
                  ON i.id_fam = f.id_fam
                  ON f.id-fam = i.id-fam
Ou bien je ne peut pas, et je dois faire 2 fois le INNER JOIN ?
tifil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2013, 10h41   #19
al1_24
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 876
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 52
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 876
Points : 11 750
Points : 11 750
Un petit peu de lecture ?
__________________
Modérateur Langage SQL
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
N'oubliez pas le bouton et pensez aux balises
[code]
Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/03/2013, 11h03   #20
mnitu
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 4 115
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 4 115
Points : 8 013
Points : 8 013
Citation:
Envoyé par Rei Ichido Voir le message
...La clause ON est obligatoire après un INNER JOIN. Il faut donc la mettre - sinon, votre requête SQL ne se termine pas correctement ...
...
Using ?
Quelle marotte cette histoire de ANSI Join. Encore une fois: le problème c’est comprendre les jointures et non pas faire une obsession de la syntaxe.
Libre à chacun d’utiliser ce qui lui plaise.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 01h18.


 
 
 
 
Partenaires

Hébergement Web