Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Base de données ou flou artistique?

29 réponses
Avatar
LiR
Bonjour à tous,

Je crée une requête Sélection dans Access XP SP3.
Cette requête repose sur une requête et 3 tables, liées par des jointures,
mais peu importe en fait.

1.
Je mets une condition sur un champ d'une des tables
La requête me renvoie alors zéro enregistrement

2.
J'ajoute une seconde condition sur un autre champ d'une autre table de la
requête
Cette condition est ajoutée sur la même ligne q'en 1., donc elle est liée
par AND à la première condition
La requête me renvoie plusieurs enregistrements

Ce comportement est, vous en conviendrez, tout simplement impossible
théoriquement.

Pour l'info (mais cela n'a aucun effet sur le principe) :
Condition 1 sur le champ 1 : Vrai Ou Est Null
Condition 2 sur le champ 1 : <>0

A noter, pour s'étonner encore un peu, que si je mets comme condition 2 : >0
Alors la requête, à nouveau, me retourne zéro enregistrement

Quelqu'un saurait d'où peut venir un comportement aussi catastrophique?

9 réponses

1 2 3
Avatar
LiR
Nous n'avons certes pas la même conception des choses.
Je distingue pour ma part jointure et relation, cohérence et optimisation.

Mais, par curiosité, vous n'avez réellement jamais fait de jointure sur des
tables sans qu'une relation n'existe? vraiment jamais?

"Michel__D" a écrit :


"LiR" a écrit dans le message de news:
> Pour ma part une jointure dans une requête n'implique ni ne nécessite aucune
> relation.
> L'incohérence c'est une requête qui ne fait pas son boulot.
>
> Il suffit de lire ceci pour s'en convaincre :
> http://office.microsoft.com/fr-fr/access/HA102051321036.aspx#3
>
> Et la définition des LEFT et RIGHT JOIN, fort justement,
> ne fait aucune mention de relation :
> http://office.microsoft.com/fr-fr/access/HA012314891036.aspx?pid=CH100728991036
>
> Excusez-moi, mais que celui qui n'a jamais fait une jointure dans une requête
> entre 2 tables qui n'ont pas de relation lève le doigt!
>
> Je me répête, je suis désolé, mais pour moi une requête incohérente ça
> n'existe pas.
> Un moteur de données digne de ce nom doit pouvoir répondre à une requête
> dans la limite
> de ses spécifications de fonctionnement (au passage, le moteur ne va pas
> philospher sur l'utilité ou non de votre requête !)
> Vous avez raison, Microsoft Access nécessite visiblement quelques renforts.
> J'aimerais juste connaître sa limite de fonctionnement.
>
> Je rappelle que si le champ apdevisstatus_ok est de type entier long,
> qu'il y ait clé primaire ou on, relations ou non, 1 ou 100000
> enregistrements, la requête fonctionne.
> Cela vous paraît-il incohérent qu'une requête fonctionne sans index ni
> relation?
> Moi non.

Pour moi c'est incohérent d'utiliser un mécanisme qui met en oeuvre des
relations (jointures) et de ne pas définir ces mêmes relations et lorsque
ces relations ne sont pas définis, et bien Access le signale par un
résultat erroné, c'est sur cela serait mieux qu'il t'informe gentiment que
tu as omis de définir quelque chose, maintenant c'est un logiciel de
base de données relationnelles, donc ...




Avatar
Dragan
Le problème majeur ici n'est pas la raison de la requête, ni sa construction
en elle-même mais les conclusions que vous en tirez.
Voyez par vous-même, vous effectuez une requête sur une tale que vous savez
vide et de manière à contourner le problème vous faites un RIGHT JOIN pour
être sûr d'obtenir des enregistrements puis sur ces enregistrements retournés
vous testez le contenu des champs de la table vide.
Avatar
LiR
Allez donc dire (puisqu'il s'agit du même principe) à Microsoft que son
assistant création de requête de non correspondance est un problème.
Comprenez-vous ce que signifie non correspondance?


Je vous lance un défi :

Dans les condition énoncées prédédemment de la structure et des données de
ma base (10000 enregistrements dans les tables DossierEtbObj et instrDevis,
aucun dans la table apdevisstatus),

considérons la requete test_005 suivante :

Requête test_005 :

SELECT InstrDevis.ID_INSTRDEVIS
FROM (apDevisStatus
RIGHT JOIN DossierEtbObj
ON apDevisStatus.N_DEVISSTATUS = DossierEtbObj.dossetbobj_etat)
INNER JOIN InstrDevis
ON DossierEtbObj.ID_DOSSETBOBJ = InstrDevis.IDR_DOSSETBOBJ
WHERE (((apDevisStatus.devisstatus_ok) Is Null));

Je vous mets au défi de répondre à ces 2 question :

1. Si v vaut NULL, que vaut (V IS NULL) ?
2. Combien d'enregitrements la requête test_005 renvoie-t-elle?


"Dragan" a écrit :

Le problème majeur ici n'est pas la raison de la requête, ni sa construction
en elle-même mais les conclusions que vous en tirez.
Voyez par vous-même, vous effectuez une requête sur une tale que vous savez
vide et de manière à contourner le problème vous faites un RIGHT JOIN pour
être sûr d'obtenir des enregistrements puis sur ces enregistrements retournés
vous testez le contenu des champs de la table vide.






Avatar
Dragan
Je sais ce que j'entends par non correspondance et ce ne peut être en aucun
cas la requête que vous exposez.
Une requête de non-correspondance rejette les enregistrements pour lesquels
le champ de jointure est Non Null.
Donc la clause WHERE doit porter sur la nullité du champ de correspondance
soit n_Devistatus et non sur DevisStatus_ok.

Requête de non-correspondance
SELECT InstrDevis.ID_INSTRDEVIS
FROM (apDevisStatus
RIGHT JOIN DossierEtbObj
ON apDevisStatus.N_DEVISSTATUS = DossierEtbObj.dossetbobj_etat)
INNER JOIN InstrDevis
ON DossierEtbObj.ID_DOSSETBOBJ = InstrDevis.IDR_DOSSETBOBJ
WHERE apDevisStatus.n_devisstatus Is Null;

En clair, il est demandé ici tous les enregistrements commun à DossierEtbOBJ
et InstrDevis excepté ceux qui ont un équivalent dans n_devisStatus. Or les
enregistrements correspondants dans apDevisStatus ont forcément le champ clé
non nul peu importe le contenu de DevisStatus_ok


"LiR" a écrit :

Allez donc dire (puisqu'il s'agit du même principe) à Microsoft que son
assistant création de requête de non correspondance est un problème.
Comprenez-vous ce que signifie non correspondance?


Je vous lance un défi :

Dans les condition énoncées prédédemment de la structure et des données de
ma base (10000 enregistrements dans les tables DossierEtbObj et instrDevis,
aucun dans la table apdevisstatus),

considérons la requete test_005 suivante :

Requête test_005 :


Je vous mets au défi de répondre à ces 2 question :

1. Si v vaut NULL, que vaut (V IS NULL) ?
2. Combien d'enregitrements la requête test_005 renvoie-t-elle?


"Dragan" a écrit :

> Le problème majeur ici n'est pas la raison de la requête, ni sa construction
> en elle-même mais les conclusions que vous en tirez.
> Voyez par vous-même, vous effectuez une requête sur une tale que vous savez
> vide et de manière à contourner le problème vous faites un RIGHT JOIN pour
> être sûr d'obtenir des enregistrements puis sur ces enregistrements retournés
> vous testez le contenu des champs de la table vide.
>
>
>
>


Avatar
Michel__D
Re,

LiR a écrit :
Nous n'avons certes pas la même conception des choses.
Je distingue pour ma part jointure et relation, cohérence et optimisation.

Mais, par curiosité, vous n'avez réellement jamais fait de jointure sur des
tables sans qu'une relation n'existe? vraiment jamais?



La question n'est pas de savoir si j'ai déja utilisé une requête
avec jointure sans définir les relations, mais de savoir pourquoi
une requête ne fournit pas le résultat souhaité et dans ce cas il
est impératif d'agir dans les règles de l'art et c'est seulement
aprés que l'on peut dire qu'il y a un dysfonctionnement.

Maintenant si ton but était de découvrir les limites d'Access et bien
tu viens d'en découvrir une, mais bon la plupart des applis ont
leurs limites.
Avatar
LiR
Alors regardez bien le point 10 de la rubrque :

"Créer et modifier une requête de non-correspondance effectuer une
comparaison sur plus d'un champ"

De la page :
"Comparer deux tables et rechercher des enregistrements sans correspondance

Voisi le lien :
http://office.microsoft.com/fr-fr/access/HA102051321036.aspx#2

Vous serez surpris.


"Dragan" a écrit :

Je sais ce que j'entends par non correspondance et ce ne peut être en aucun
cas la requête que vous exposez.
Une requête de non-correspondance rejette les enregistrements pour lesquels
le champ de jointure est Non Null.
Donc la clause WHERE doit porter sur la nullité du champ de correspondance
soit n_Devistatus et non sur DevisStatus_ok.

Requête de non-correspondance
SELECT InstrDevis.ID_INSTRDEVIS
FROM (apDevisStatus
RIGHT JOIN DossierEtbObj
ON apDevisStatus.N_DEVISSTATUS = DossierEtbObj.dossetbobj_etat)
INNER JOIN InstrDevis
ON DossierEtbObj.ID_DOSSETBOBJ = InstrDevis.IDR_DOSSETBOBJ
WHERE apDevisStatus.n_devisstatus Is Null;

En clair, il est demandé ici tous les enregistrements commun à DossierEtbOBJ
et InstrDevis excepté ceux qui ont un équivalent dans n_devisStatus. Or les
enregistrements correspondants dans apDevisStatus ont forcément le champ clé
non nul peu importe le contenu de DevisStatus_ok


"LiR" a écrit :

> Allez donc dire (puisqu'il s'agit du même principe) à Microsoft que son
> assistant création de requête de non correspondance est un problème.
> Comprenez-vous ce que signifie non correspondance?
>
>
> Je vous lance un défi :
>
> Dans les condition énoncées prédédemment de la structure et des données de
> ma base (10000 enregistrements dans les tables DossierEtbObj et instrDevis,
> aucun dans la table apdevisstatus),
>
> considérons la requete test_005 suivante :
>
> Requête test_005 :
>
>
> Je vous mets au défi de répondre à ces 2 question :
>
> 1. Si v vaut NULL, que vaut (V IS NULL) ?
> 2. Combien d'enregitrements la requête test_005 renvoie-t-elle?
>
>
> "Dragan" a écrit :
>
> > Le problème majeur ici n'est pas la raison de la requête, ni sa construction
> > en elle-même mais les conclusions que vous en tirez.
> > Voyez par vous-même, vous effectuez une requête sur une tale que vous savez
> > vide et de manière à contourner le problème vous faites un RIGHT JOIN pour
> > être sûr d'obtenir des enregistrements puis sur ces enregistrements retournés
> > vous testez le contenu des champs de la table vide.
> >
> >
> >
> >


Avatar
Dragan
Ok LiR,
pour rappel ton problème portait sur une requête dans laquelle le champ
DevisStatus_ok devait être TRUE; maintenant tu parles de requête de
non-correspondance avec la table contenant ce champ.
Encore une fois où est la cohérence ?
Tu souhaites les enregistrements absents d'une table mais quand même l'un
des champs des enregistrements inexsitants doit avoir une certaine valeur.
Après quoi, tu en conclues qu'il y a un problème.
N'importe quoi.


"LiR" a écrit :

Alors regardez bien le point 10 de la rubrque :

"Créer et modifier une requête de non-correspondance effectuer une
comparaison sur plus d'un champ"

De la page :
"Comparer deux tables et rechercher des enregistrements sans correspondance

Voisi le lien :
http://office.microsoft.com/fr-fr/access/HA102051321036.aspx#2

Vous serez surpris.


"Dragan" a écrit :

> Je sais ce que j'entends par non correspondance et ce ne peut être en aucun
> cas la requête que vous exposez.
> Une requête de non-correspondance rejette les enregistrements pour lesquels
> le champ de jointure est Non Null.
> Donc la clause WHERE doit porter sur la nullité du champ de correspondance
> soit n_Devistatus et non sur DevisStatus_ok.
>
> Requête de non-correspondance
> SELECT InstrDevis.ID_INSTRDEVIS
> FROM (apDevisStatus
> RIGHT JOIN DossierEtbObj
> ON apDevisStatus.N_DEVISSTATUS = DossierEtbObj.dossetbobj_etat)
> INNER JOIN InstrDevis
> ON DossierEtbObj.ID_DOSSETBOBJ = InstrDevis.IDR_DOSSETBOBJ
> WHERE apDevisStatus.n_devisstatus Is Null;
>
> En clair, il est demandé ici tous les enregistrements commun à DossierEtbOBJ
> et InstrDevis excepté ceux qui ont un équivalent dans n_devisStatus. Or les
> enregistrements correspondants dans apDevisStatus ont forcément le champ clé
> non nul peu importe le contenu de DevisStatus_ok
>
>
> "LiR" a écrit :
>
> > Allez donc dire (puisqu'il s'agit du même principe) à Microsoft que son
> > assistant création de requête de non correspondance est un problème.
> > Comprenez-vous ce que signifie non correspondance?
> >
> >
> > Je vous lance un défi :
> >
> > Dans les condition énoncées prédédemment de la structure et des données de
> > ma base (10000 enregistrements dans les tables DossierEtbObj et instrDevis,
> > aucun dans la table apdevisstatus),
> >
> > considérons la requete test_005 suivante :
> >
> > Requête test_005 :
> >
> >
> > Je vous mets au défi de répondre à ces 2 question :
> >
> > 1. Si v vaut NULL, que vaut (V IS NULL) ?
> > 2. Combien d'enregitrements la requête test_005 renvoie-t-elle?
> >
> >
> > "Dragan" a écrit :
> >
> > > Le problème majeur ici n'est pas la raison de la requête, ni sa construction
> > > en elle-même mais les conclusions que vous en tirez.
> > > Voyez par vous-même, vous effectuez une requête sur une tale que vous savez
> > > vide et de manière à contourner le problème vous faites un RIGHT JOIN pour
> > > être sûr d'obtenir des enregistrements puis sur ces enregistrements retournés
> > > vous testez le contenu des champs de la table vide.
> > >
> > >
> > >
> > >


Avatar
LiR
Voilà.

Par contre ce n'était pas mon but malheureusement.
Je m'en serais bien passé.

Vous n'avez pas souhaité répondre à ma question?

"Michel__D" a écrit :

Re,

LiR a écrit :
> Nous n'avons certes pas la même conception des choses.
> Je distingue pour ma part jointure et relation, cohérence et optimisation.
>
> Mais, par curiosité, vous n'avez réellement jamais fait de jointure sur des
> tables sans qu'une relation n'existe? vraiment jamais?

La question n'est pas de savoir si j'ai déja utilisé une requête
avec jointure sans définir les relations, mais de savoir pourquoi
une requête ne fournit pas le résultat souhaité et dans ce cas il
est impératif d'agir dans les règles de l'art et c'est seulement
aprés que l'on peut dire qu'il y a un dysfonctionnement.

Maintenant si ton but était de découvrir les limites d'Access et bien
tu viens d'en découvrir une, mais bon la plupart des applis ont
leurs limites.



Avatar
Michel__D
"LiR" a écrit dans le message de news:
Voilà.

Par contre ce n'était pas mon but malheureusement.
Je m'en serais bien passé.

Vous n'avez pas souhaité répondre à ma question?



Oui car cela n'apporterais rien au débat, puisque lorsque je suis
confronté à un comportement qui me paraît anormal je refais tous
les tests dans les conditions optimums en respectant les régles
de l'art ce qui permet de régler pratiquement tous les problèmes.
1 2 3