+ Répondre à la discussion
Page 1 sur 2 12 DernièreDernière
Affichage des résultats 1 à 20 sur 26
  1. #1

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    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.

  2. #2
    Membre confirmé
    Inscrit en
    février 2007
    Messages
    210
    Détails du profil
    Informations forums :
    Inscription : février 2007
    Messages : 210
    Points : 209
    Points
    209

    Par défaut

    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

  3. #3

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    Par défaut

    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 ?

  4. #4
    Membre Expert
    Inscrit en
    août 2009
    Messages
    1 046
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 046
    Points : 1 750
    Points
    1 750

    Par défaut

    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 !

  5. #5
    Modérateur
    Avatar de al1_24
    Homme Profil pro Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 670
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    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 : 5 670
    Points : 14 583
    Points
    14 583

    Par défaut

    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  6. #6
    Modérateur

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Î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 899
    Points : 14 356
    Points
    14 356

    Par défaut

    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 ?

  7. #7

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    Par défaut

    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.

  8. #8
    Modérateur
    Avatar de al1_24
    Homme Profil pro Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 670
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    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 : 5 670
    Points : 14 583
    Points
    14 583

    Par défaut

    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  9. #9

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    Par défaut

    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.

  10. #10
    Membre du Club
    Homme Profil pro
    ingénieur d'étude PL/SQL
    Inscrit en
    octobre 2002
    Messages
    50
    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 : 50
    Points : 50
    Points
    50

    Par défaut

    Code :
    1
    2
    3
    4
    5
    	cr_adresse as t3,
    INNER JOIN 
    	cr_allocataire as t4,
    WHERE

    tu as laissé trainer une virgule

  11. #11
    Membre Expert
    Inscrit en
    août 2009
    Messages
    1 046
    Détails du profil
    Informations forums :
    Inscription : août 2009
    Messages : 1 046
    Points : 1 750
    Points
    1 750

    Par défaut

    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.

  12. #12

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    Par défaut

    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.

  13. #13
    Modérateur

    Homme Profil pro Fabien
    Ingénieur d'études en décisionnel
    Inscrit en
    septembre 2008
    Messages
    6 899
    Détails du profil
    Informations personnelles :
    Nom : Homme Fabien
    Âge : 36
    Localisation : France, Paris (Î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 899
    Points : 14 356
    Points
    14 356

    Par défaut

    Oracle ne supporte pas le mot clef AS pour les alias de tables.

  14. #14
    Membre du Club
    Homme Profil pro
    ingénieur d'étude PL/SQL
    Inscrit en
    octobre 2002
    Messages
    50
    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 : 50
    Points : 50
    Points
    50

    Par défaut

    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)

  15. #15

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    Par défaut

    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.

  16. #16
    Modérateur
    Avatar de al1_24
    Homme Profil pro Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 670
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    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 : 5 670
    Points : 14 583
    Points
    14 583

    Par défaut

    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  17. #17

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    Par défaut

    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.

  18. #18

    Homme Profil pro
    Étudiant
    Inscrit en
    décembre 2011
    Messages
    54
    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 : 54
    Points : -2
    Points
    -2

    Par défaut

    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 ?

  19. #19
    Modérateur
    Avatar de al1_24
    Homme Profil pro Alain
    Ingénieur d'études décisionnel
    Inscrit en
    mai 2002
    Messages
    5 670
    Détails du profil
    Informations personnelles :
    Nom : Homme Alain
    Âge : 53
    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 : 5 670
    Points : 14 583
    Points
    14 583

    Par défaut

    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
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  20. #20
    Expert Confirmé Sénior Avatar de mnitu
    Homme Profil pro Marius Nitu
    Ingénieur développement logiciels
    Inscrit en
    octobre 2007
    Messages
    4 646
    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 646
    Points : 9 149
    Points
    9 149

    Par défaut

    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •