|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
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 :
Merci d'avance pour votre aide. |
||
|
|
00
|
|
|
#2 |
|
Membre actif
![]() Inscription : février 2007 Messages : 181 ![]() |
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 |
|
|
10
|
|
|
#3 |
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
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 ? |
|
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 1 013 ![]() |
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 ! |
|
|
10
|
|
|
#5 | ||
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 876 ![]() |
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 :
__________________
Modérateur Langage 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
|
||
|
|
00
|
|
|
#6 |
![]() ![]() |
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 |
|
10
|
|
|
#7 |
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
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. |
|
|
01
|
|
|
#8 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 876 ![]() |
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 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
|
|
|
00
|
|
|
#9 | ||
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
Voici mon nouveau code, ou j'ai jouté des jointures:
Code :
Par contre, j'ai une petite erreur, il me dit que la commande sql ne se termine pas correctement. |
||
|
|
01
|
|
|
#10 | ||
|
Nouveau Membre du Club
![]() ingénieur d'étude PL/SQL Inscription : octobre 2002 Messages : 41 ![]() |
Code :
tu as laissé trainer une virgule |
||
|
|
10
|
|
|
#11 |
|
Membre Expert
![]() Inscription : août 2009 Messages : 1 013 ![]() |
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. |
|
|
10
|
|
|
#12 |
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
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. |
|
|
01
|
|
|
#13 |
![]() ![]() |
Oracle ne supporte pas le mot clef AS pour les alias de tables.
__________________
Email : http://scr.im/waldar |
|
00
|
|
|
#14 | ||
|
Nouveau Membre du Club
![]() ingénieur d'étude PL/SQL Inscription : octobre 2002 Messages : 41 ![]() |
Code :
|
||
|
|
00
|
|
|
#15 |
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
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. |
|
|
00
|
|
|
#16 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 876 ![]() |
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 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
|
|
|
00
|
|
|
#17 |
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
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. |
|
|
00
|
|
|
#18 | ||
Étudiant Inscription : décembre 2011 Messages : 45 ![]() |
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 :
|
||
|
|
00
|
|
|
#19 |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 876 ![]() |
Un petit peu de lecture ?
__________________
Modérateur Langage 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
|
|
|
00
|
|
|
#20 | |
|
Expert Confirmé Sénior
![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 4 115 ![]() |
Citation:
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. |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com