IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Requêtes et SQL. Discussion :

requête SQL problème avec relation N-N


Sujet :

Requêtes et SQL.

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut requête SQL problème avec relation N-N
    Bonjour,

    Je vous expose mon problème.
    j'ai une BD qui repertorie les plantes et toute leur caractéristique ainsi que leurs utilisations.

    la structure est comme suit:
    T_IDplante 1 --- N T_Utilisation (standardisées)
    T_IDplante 1 ---N T_ID/Util N----1 T_AutreUtilisation

    T_IDplante contient la description de la plante
    T_Utilisation contient une serie de champs O/N comme Haie, isolé, rocaille,...
    T_AutreUtilisation contient un listing des autres utilisations possibles comme sel de déneigement, culinaire/aromatique, champêtre,... un peu de tout.

    Mon problème est que j'arrive parfaitement à faire un formulaire multi-critère sur les tables IDPlante et Utilisation mais un seul critère de la table AutreUtilisation.
    Si je met plus qu'un seul critère, ca me retourne 0 plantes.

    voici la partie de mon code qui me pose problème:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL = "SELECT Identité.ID, Identité.[nom latin], Identité.type, Identité.feuillage, Identité.exposition FROM TAutrUtil INNER JOIN ((Identité INNER JOIN utilisation ON Identité.ID = utilisation.ID) INNER JOIN [ID/Util] ON Identité.ID = [ID/Util].IDPlante) ON TAutrUtil.AutrUtil = [ID/Util].AUtil WHERE Identité.ID<>0"
     
    ...
    If Not IsNull(Me.AUtil1) Then
    SQL = SQL & " And [ID/Util].AUtil =" & "'" & Me.AUtil1 & "'"
    End If
    If Not IsNull(Me.AUtil2) Then
    SQL = SQL & " And [ID/Util].AUtil =" & "'" & Me.AUtil2 & "'"
    End If
    If Not IsNull(Me.AUtil3) Then
    SQL = SQL & " And [ID/Util].AUtil =" & "'" & Me.AUtil3 & "'"
    End If
     
    ...
    Quelqu'un peut il m'aider a comprendre où se situe mon erreur.
    merci

  2. #2
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    Essaie peut-être le tuto de debuggage des requêtes SQL écrites par VBA.
    J'aime les gâteaux.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    Je vais lire ca mais je ne pense pas que ce soit un problème de synthaxe mais plutot un problème d'operateur.

    Malheureusement si j'utilise le OU ils va me retourner plusieurs enregistrements mais qui correspondent pas spécialement au 2 critères a la fois!

    Y a t'il une autre solution?

  4. #4
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    mais qui correspondent pas spécialement au 2 critères a la fois!
    ça ne peut pas correspondre aux deux critères à la fois puisque tes deux critères donnent deux valeurs différentes à un même champs.
    J'aime les gâteaux.

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    Bonjour Demco,

    C'est bien ce que je craignais.
    Vois tu un moyen qui me permettrais de contourner le problème et de me retourner les enregistrement qui correspondent au 2 critères?

  6. #6
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut p'tite Sandrine et Demco,

    p'tite Sandrine j'ai plusieurs remarques à faire:
    .le nom de tes tables ne correspondent pas à ceux décrits.
    .tu ne dis pas non plus l'utilité de ID/UTIL qui ne me parait pas nécessaire (mais c'est vrai: là n'est pas la question).
    .tu demande comme critère: ... et AUtil='champêtre' et AUtil='culinaire/aromatique'...
    tu comprends bien que AUtil ne peut être les deux à la fois, ce qui explique que tu n'as plus aucun résultat quand tu veux mettre plus de deux critère sur AUtil.
    .il faut effectivement mettre OU
    mais tu oublie comment est faite ta requete: si tu mets des OU à la place:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL = SQL & " OR [ID/Util].AUtil
    tu auras après:
    WHERE Identité.ID<>0 OR [ID/Util].AUtil=... OR [ID/Util].AUtil=...
    ce qui fait sauté ta première condition: Identité.ID<>0
    il te faut:
    WHERE Identité.ID<>0 AND ([ID/Util].AUtil=... OR [ID/Util].AUtil=...)

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    bonjour Vodiem,

    ma clause Where :
    n'est là que pour avoir mon WHERE dans mon SQL puisque dans ma table identité, ID ne peux être null puisqu'il s'agit de ma clé primaire. Donc si celle-ci est annulé ca n'est pas bien grave. (De plus les ... remplacent mes autres critères de selections qui marchent parfaitement bien mais qui prennent quasi une page complête et encombrerait mon post. Ceux-ci sont introduit par AND egalement)

    Sinon je suis bien d'accord avec toi, mon premier critère "Autre Utilisation" est bien introduit par AND.

    L'endroit ou ca coince c'est a partir du 2 eme "Autre Utilisation".
    Je suis bien d'accord avec Demco c'est logique qu'avec mon deuxième critère AND ca me retourne plus rien puisque c'est tout dans le même champs mais avec OR ca me retourne pas la bonne sélection.
    Puisque ca va me retourner ceux qui ont le premier critère ou le deuxième ou les deux.
    Et pas ce que je cherche a savoir le premier ET le deuxième.

    C'est là que je cherche une alternative

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    En fait je pense que je vais devoir imbriquer plusieurs requêtes selections les unes dans les autres.

    Mais sait-on le faire avec des requêtes SQL?
    Si oui quelle est la méthode a suivre?

  9. #9
    Membre chevronné
    Avatar de Demco
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    1 396
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 1 396
    Points : 2 228
    Points
    2 228
    Par défaut
    mais avec OR ca me retourne pas la bonne sélection.
    Puisque ca va me retourner ceux qui ont le premier critère ou le deuxième ou les deux.
    Et pas ce que je cherche a savoir le premier ET le deuxième.
    Je ne comprends pas trop.
    Il faudrait que tu nous donnes des exemples avec des données car je n'arrive pas à comprendre clairement ce que tu attends.

    Donne des exemples de valeurs à tes champs, et dis nous ce que tu souhaites avoir comme valeurs retournées par ta requêtes.
    J'aime les gâteaux.

  10. #10
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    ok, j'ai compris.
    j'ai eu un doute que ce soit bien cela que tu souhaitais

    effectivement ton pb c'est que pour un ID tu as plusieurs enregistrements et tu veux faire un test avec ID ayant ET champ AUtil de l'enregistement1 ET champ AUtil de l'enregistrement2 (correspondant à l'ID)...
    Tu as raison, il n'est pas possible de faire avec une requete simple avec un AND sur plusieurs enregistrements, l'imbrication devrait pouvoir résoudre ce prob.
    mais tu peux choisir une autre solus:
    transformer tes n enregistrements en 1 enregistrement à n champs.
    ainsi tu pourras utiliser ton AND.
    tu pourras t'inspirer de la discution ici

  11. #11
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    ok,

    par exemple:
    T_ID/Util (pour plus facile je vous met des nom de plante plutot que chiffre ID)
    Clematis flammula = resistant au sel
    Clematis flammula = parfumé
    Wisteria floribunda= resistant au sel

    si dans mon formulaire de recherche sur l'onglet Autre utilisation, dans la 1er colonne déroulante l'utilisateur selectionne "resistant au sel"
    Ca doit me retourner:

    Clematis flammula
    Wisteria floribunda

    Si l'utilisateur veut pousser plus loin sa recherche et choisi dans la 2eme liste déroulante "parfumé"
    ca doit me retourné:

    Clematis flammula

    l'autre n'etant pas parfumé.

    Est ce que ca vous aide

  12. #12
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    tu peux encore dans ce cas récupérer la première requete comme source pour la seconde requete.

  13. #13
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    Ca serais parfait!!
    C'est exactement ca que j'aimerais faire.

    Mais j'aimerais savoir comment récupérer ma première requete SQL comme source pour la 2eme.
    Car là j'ai un peu de mal sur la façon de l'écrire.

  14. #14
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    si la source se trouve sur le form:
    tu utilise un truc de ce genre dans l'év après MAJ de la 2me liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.RecordSource = "SELECT * FROM (" & Replace(Me.RecordSource, ";", "") & ") WHERE ..."
    le 'replace' est là par précaution.

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    bon voilà,
    J'ai un peu tester et pour l'instant ca donne rien.

    j'ai donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Dim SQL As String
     
    SQL = "SELECT * FROM (" & Replace(Me.lstTrouv.RowSource, ";", "") & ") WHERE [ID/Util].AUtil =" & "'" & Me.AUtil2 & "'" & " ORDER BY Identité.[nom latin];"""
    debug.print SQL
    Me.lstTrouv.RowSource = SQL
    Me.lstTrouv.Requery
    ce qui me retourne la requête suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM (SELECT Identité.ID, Identité.[nom latin], Identité.type, Identité.feuillage, Identité.exposition FROM TAutrUtil INNER JOIN ((Identité INNER JOIN utilisation ON Identité.ID = utilisation.ID) INNER JOIN [ID/Util] ON Identité.ID = [ID/Util].IDPlante) ON TAutrUtil.AutrUtil = [ID/Util].AUtil WHERE Identité.ID<>0 And [ID/Util].AUtil ='résistant au sel' ORDER BY Identité.[nom latin]) WHERE [ID/Util].AUtil ='alignement' ORDER BY Identité.[nom latin];"
    Il m'indique que j'ai un résultat mais vide.

  16. #16
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    il peut être vide si:
    dans la première requete tu n'as pas d'élément correspondant pour la deuxième.
    ce qui veut dire dans ton exemple:
    qu'il faut qu'il soit d'abord 'résistant au sel' ET ensuite il doit être 'alignement'.

    es ce bien ce que tu recherches?

  17. #17
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    mouais, ca sent pas terrible...

    l'erreur vient de la première requete: il faut qu'elle inclus tous les enregistrements de l'id et pas seulement les enregistrements avec le premier critère sur le champ AUtil.

  18. #18
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    Bon, je crois que je vais laisser mon problème en suspend quelques jours.

    Je viens de recevoir une note de service et on va passer a OpenOffice donc mieux vaut d'abord savoir comment récupérer tout ce qui a été fait avant d'aller plus loin!

    Grrr, maintenant que je commence a bien m'en sortir avec Access, ben on change!

    Donc si vous connaissez un endroit qui explique comment migrer de l'un a l'autre en gardant, relations, données et formulaire? C'est le bienvenu!

  19. #19
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    325
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Septembre 2006
    Messages : 325
    Points : 207
    Points
    207
    Par défaut
    Bonjour,

    me revoilà!
    Ils m'ont fait peur mais tout rentre dans l'ordre pour finir seul Word et Excel passeront en OOo.


    Donc, j'ai repris mes test.
    Alors j'essaye toujours de crer ma requête selection en SQL avec des sous requête pour pouvoir avoir plusieurs critères pour les autres utilisation mais j'ai un problème apparement au niveau de mes jointures (JOIN).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Identité.ID, Identité.[nom latin], Identité.type, Identité.feuillage, Identité.exposition FROM (SELECT Identité.ID, Identité.[nom latin], Identité.type, Identité.feuillage, Identité.exposition FROM Identité INNER JOIN utilisation ON Identité.ID = utilisation.ID WHERE Identité.ID<>0 ORDER BY Identité.[nom latin]) INNER JOIN (SELECT [ID/Util].IDPlante, [ID/Util].AUtil FROM [ID/Util] WHERE [ID/Util].AUtil ='culinaire/aromatique' ) ON [ID/Util].IDPlante = Identité.ID  ORDER BY Identité.[nom latin];
    Mais j'arrive pas trop a la trouver donc si l'un d'entre vous a une idée?

  20. #20
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    bon si je reprends:
    après l'événement de la première zone de liste: tu as cette requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Identité.ID, Identité.[nom latin], Identité.type, Identité.feuillage, Identité.exposition FROM TAutrUtil INNER JOIN ((Identité INNER JOIN utilisation ON Identité.ID = utilisation.ID) INNER JOIN [ID/Util] ON Identité.ID = [ID/Util].IDPlante) ON TAutrUtil.AutrUtil = [ID/Util].AUtil WHERE Identité.ID<>0 And [ID/Util].AUtil ='résistant au sel' ORDER BY Identité.[nom latin]
    là c'est ok.

    après l'év de la deuxième zone de liste, c'est là que tu bloques.
    tu voudrais avoir tout ceux de la requete précédente qui ont le critère de la deuxième zone de liste.
    j'avais remarqué un pb: il faut récupérer les id de la première requete, pas l'ensemble du résultat pour la deuxième.

    la requete aura la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * FROM TAutrUtil INNER JOIN ((Identité INNER JOIN utilisation ON Identité.ID = utilisation.ID) INNER JOIN [ID/Util] ON Identité.ID = [ID/Util].IDPlante) ON TAutrUtil.AutrUtil = [ID/Util].AUtil "
    (structure de tes tables)
    et c'est ici que l'on change:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "WHERE (Identité.ID IN (SELECT Identité.ID FROM (" & MaRequetePrécédente & ")))"
    pour récupérer tous les enregistrements des Identité.ID concernés et on rajoute:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "AND ([ID/Util].AUtil ='" & CritereDeZoneDeListe & "')"
    j'aurais peut être pas du formaliser avec tous tes champs, ca fait compliqué.
    je sais j'ai pas répondu au post précédent... mais je pense qu'avec ce que je t'ai dit là tu devrais t'en sortir.

    ps:il peut y avoir des pb de références: rajoute des alias.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Requête sql problème avec un 'LIKE'
    Par Farow dans le forum Langage SQL
    Réponses: 4
    Dernier message: 11/10/2011, 09h31
  2. [SQL] Problème avec une requête sql
    Par bodysplash007 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 11/05/2007, 17h30
  3. [SQL] Problème avec une requête
    Par jcmskip dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/04/2007, 11h41
  4. [SQL] Problème avec script de pagination et requête sql sur deux tables
    Par psychoBob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/06/2006, 14h06
  5. [SQL] problème avec ma requête UPDATE
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 07/04/2006, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo