Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
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 14/03/2011, 17h01   #1
Membre actif
 
Avatar de tribaleur
 
Développeur informatique
Inscription : mai 2006
Messages : 342
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 342
Points : 177
Points : 177
Par défaut Tests sur ForeignKey ou PrimariKey différents?

Bonjour à tous.
Je doit me remettre au SQL pour les besoins de mon employeur, et après quelques heures de recherche je me pose une question :

-J'ai une requête (voir ci-dessous) qui comporte des jointures sur des codes. Selon si je fait mon test sur le code clé étrangère ou sur le code clé primaire, la requête ne me renvoie pas le même résultats ... pourtant c'est le même code dans les deux table (normal ... principe de la jointure ). Je me demandai donc si c'était normal ou non? Voici ma requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
SELECT cg.colla,
       ...,
       cv.lib    

FROM cg INNER JOIN ca
     ON ca.Art=cg.Artic      
     ...     
     INNER JOIN cv
     ON (cv.Objet="COLLA_GRPCO" and (cv.Code=ca.GrpCo))
     
WHERE ...  
      ... and ca.GrpCO = UPPER(:P_Reg)  // ici ":P_Reg" est un paramètre dans Paradox
      // Si je test : "and cv.code = UPPER(:P_Reg)" => Renvoie un autre résultat
GROUP BY cg.colla, ... ,cv.lib
J'ai enlevé les jointures et colonnes inutiles car je ne pense pas que cela vienne d'eux ... enfin je vois pas pourquoi.

Voila j'ai peut-être oublié une règle de base dans SQL ... quoi que je suis sous Paradox ... je suis pas sur que ça aide (oui je n'aime pas ce SGBDR )

Donc pour résumé, si je test mon code sur le champ de la table "cv" ou sur celui de la table "ca", cela ne renvoie pas le même résultats alors que ses deux champs sont liés dans la requête.

Si vous avez des remarques ou tout simplement pas compris je suis dispo.

Merci d'avance à tous en tout cas.
__________________
Rien n'est rien!!! ... Tout est quelque chose!!!

Petits liens utils :
-Chaine de connexion : http://www.connectionstrings.com/
-ADO et ADO.net : Tuto ADO et ADO.net
-Pour les utilisateurs d'ASP et VBscript : http://www.devguru.com/Technologies/...ript_list.html
tribaleur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 13h48   #2
Membre actif
 
Avatar de tribaleur
 
Développeur informatique
Inscription : mai 2006
Messages : 342
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 342
Points : 177
Points : 177
Bon alors en fait après pas mal de tests et d'analyse de résultats j'ai trouvé pourquoi ... et c'est logique

Donc pour faire simple :
-Quand on fait le test sur le code clé étrangère, cela fait le test uniquement sur les enregistrement de la table contenant la clé étrangère.
-Quand on fait le test sur le code de la clé primaire, cela fait le test sur la table contenant la clé primaire.

=> De ce fait dans une table comme dans l'autre on peux avoir différents enregistrements qui valide les conditions des clauses "WHERE" ... mais qui ne sont pas forcément dans l'autre table. Il faut donc bien faire le test sur la clé selon les données que l'on veux tester.

Merci quand même à tous.

Avec un peu de chance ce poste en aidera certain
__________________
Rien n'est rien!!! ... Tout est quelque chose!!!

Petits liens utils :
-Chaine de connexion : http://www.connectionstrings.com/
-ADO et ADO.net : Tuto ADO et ADO.net
-Pour les utilisateurs d'ASP et VBscript : http://www.devguru.com/Technologies/...ript_list.html
tribaleur est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 14h12   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 998
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 998
Points : 18 262
Points : 18 262
Envoyer un message via MSN à CinePhil
Le résultat de ton analyse est surprenant car tes jointures sont des jointures internes (INNER) donc, par définition et selon ta requête :
Ce qui fait que qu'une condition de restriction (dans le WHERE) sur l'une ou l'autre des colonnes faisant partie de la condition de jointure devrait donner le même résultat.

On dirait que Paradox porte bien son nom si ton analyse est juste !

Autre chose que tu peux corriger dans ta requête : dans la mesure où tes jointures sont internes, ceci est une condition de restriction qui ne devrait pas figurer dans la condition de jointure (ON) mais dans la condition de restriction (WHERE) :
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 15h05   #4
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 953
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 953
Points : 17 773
Points : 17 773
Paradox est une base de données fichiers... Donc il fait ce qu'on lui demande... Pas d'optimiseur !

A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2011, 11h38   #5
Membre actif
 
Avatar de tribaleur
 
Développeur informatique
Inscription : mai 2006
Messages : 342
Détails du profil
Informations personnelles :
Âge : 26
Localisation : France, Haute Savoie (Rhône Alpes)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : mai 2006
Messages : 342
Points : 177
Points : 177
Merci à tous les deux pour vos réponses

Il me semblais bien que normalement avec les jointures il n'y avais pas de différence sur le test ... m'enfin du coup, dans le doute, maintenant je ferai attention

En tout cas bonne continuation à tous les deux.
__________________
Rien n'est rien!!! ... Tout est quelque chose!!!

Petits liens utils :
-Chaine de connexion : http://www.connectionstrings.com/
-ADO et ADO.net : Tuto ADO et ADO.net
-Pour les utilisateurs d'ASP et VBscript : http://www.devguru.com/Technologies/...ript_list.html
tribaleur 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 21h05.


 
 
 
 
Partenaires

Hébergement Web