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 :

Access plante sur une requête avec 2 IN


Sujet :

Requêtes et SQL.

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut Access plante sur une requête avec 2 IN
    Bonjour,

    j'ai une requête avec plusieurs inner join, je veut que les résultats de ma requête restent modifiables, j'ai donc opté pour un IN à la place d'un inner join. Mais celà fait planter Access! Il se ferme de suite, avec le message de Microsoft pour envoyer l'erreur... Si j'enlève ce IN et à la place je met un inner join, la requête s'exécute correctement. Mais à ce moment la, je ne peux pas modifier les résultats...

    Autre chose folle, cette requête exécutée dans l'environnement de SQL query Analyser fonctionne parfaitement!

    La voilà:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    SELECT TerminalRepair.RepairID, TerminalRepair.SNPN, TerminalTreat.ProblemFound, TerminalTreat.RemarkTreat, Terminal.TerminalTypeID, Terminal.PartnerID, DefectRow.WarrantyEnd, DefectRow.WarrantyOK, 
    DefectRow.WarrantyEposEnd, DefectRow.WarrantyEposOK, DefectRow.DefectRowID
    FROM (TerminalTreat INNER JOIN (TerminalRepair INNER JOIN Terminal ON TerminalRepair.SNPN = Terminal.SNPN) ON TerminalTreat.RepairID = TerminalRepair.RepairID) INNER JOIN DefectRow 
    ON TerminalTreat.RepairID = DefectRow.RepairID
    WHERE (((TerminalRepair.RepairID) In (Select RepairID From 
     
    (
    SELECT TerminalRepairStock.RepairID, TypeStock
    FROM TerminalRepairStock, (SELECT TerminalRepairStock.RepairID, Max(TerminalRepairStock.DateIN) As MaxDateIn
    FROM TerminalRepairStock
    GROUP BY TerminalRepairStock.RepairID) AS LastStock
    WHERE (((TerminalRepairStock.RepairID)=LastStock.RepairID) AND ((LastStock.MaxDateIn)=TerminalRepairStock.DateIN))
    ) AS Q_SelectLastTerminalStock 
     
    WHERE TypeStock = 'Defective')) AND 
     
    ((DefectRow.DefectRowID) In 
    (Select LastDefectRowID From 
     
    (
    SELECT Max(DefectRow.DefectRowID) AS LastDefectRowID, DefectRow.RepairID
    FROM DefectRow
    GROUP BY DefectRow.RepairID
     
    )
     
    AS sq_DefectRowIDGroupByRepairID)));
    Je ne pense pas toute expliquer, car c'est compliqué. Mon problème est vraiment le deuxième IN... mais si vous avez besoin d'un complément d'information, je l'expliquerai volontiers!

    Merci d'avance!

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Inscrit en
    Juillet 2007
    Messages
    14 642
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Power Platform, ex-Développeur VBA/C#/VB.Net
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 642
    Points : 34 349
    Points
    34 349
    Par défaut
    salut,

    à toutes fins utiles, un tuto pour être IN
    http://loufab.developpez.com/tutorie.../operateur-in/

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Merci beaucoup pour ce tuto! Malheureusement je n'y ai pas trouvé quelque chose d'utile pour mon problème.
    Effectivement, il n'y a pas d'exemples avec 2 IN dans la même requêtes...mais ça peut aussi être juste pour garder les exemples simples. De plus, c'est que avec SQL ça fonctionne, donc la syntaxe est correcte, c'est Access qui ne l'aime pas.

    Une idée? ou un conseils pour modifier ce IN?

  4. #4
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 365
    Points : 19 757
    Points
    19 757
    Billets dans le blog
    65
    Par défaut
    Salut,

    Es-tu sur que le fait de ne pas pouvoir modifier les résultats de la requête n°1 vienne du inner join ?

    C'est possible, mais n'aurais-tu pas aussi un group by dans ta requête n°1 ?

    A+

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut
    Bonjour,

    oui, en fait la requête sans le dernier IN elle fonctionne bien et elle est modifiable, par contre j'ai des résultats en trop que je dois encore filtrer:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    SELECT TerminalRepair.RepairID, TerminalRepair.SNPN, TerminalTreat.ProblemFound, TerminalTreat.RemarkTreat, Terminal.TerminalTypeID, Terminal.PartnerID, DefectRow.WarrantyEnd, DefectRow.WarrantyOK, 
    DefectRow.WarrantyEposEnd, DefectRow.WarrantyEposOK, DefectRow.DefectRowID
    FROM (TerminalTreat INNER JOIN (TerminalRepair INNER JOIN Terminal ON TerminalRepair.SNPN = Terminal.SNPN) ON TerminalTreat.RepairID = TerminalRepair.RepairID) INNER JOIN DefectRow 
    ON TerminalTreat.RepairID = DefectRow.RepairID
    WHERE (((TerminalRepair.RepairID) In (Select RepairID From 
     
    (
    SELECT TerminalRepairStock.RepairID, TypeStock
    FROM TerminalRepairStock, (SELECT TerminalRepairStock.RepairID, Max(TerminalRepairStock.DateIN) As MaxDateIn
    FROM TerminalRepairStock
    GROUP BY TerminalRepairStock.RepairID) AS LastStock
    WHERE (((TerminalRepairStock.RepairID)=LastStock.RepairID) AND ((LastStock.MaxDateIn)=TerminalRepairStock.DateIN))
    ) AS Q_SelectLastTerminalStock 
     
    WHERE TypeStock = 'Defective')) 
    );
    Pour les filtrer et que ça fonctionne je dois ajouter un inner join à une autre requête (qui effectivement contient un group by). Mais comme ça elle n'est pas modifiable. ça donne ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    SELECT 
    dbo_TerminalRepair.RepairID, dbo_TerminalRepair.SNPN, dbo_TerminalTreat.ProblemFound, dbo_TerminalTreat.RemarkTreat, dbo_Terminal.TerminalTypeID, dbo_Terminal.PartnerID, dbo_DefectRow.WarrantyEnd, dbo_DefectRow.WarrantyOK, 
    dbo_DefectRow.WarrantyEposEnd, dbo_DefectRow.WarrantyEposOK, dbo_DefectRow.DefectRowID
    FROM 
    ((dbo_TerminalTreat 
    	INNER JOIN (dbo_TerminalRepair	
    		INNER JOIN dbo_Terminal 
    		ON dbo_TerminalRepair.SNPN = dbo_Terminal.SNPN)  
    	ON dbo_TerminalTreat.RepairID = dbo_TerminalRepair.RepairID) 
    	INNER JOIN dbo_DefectRow 
    	ON dbo_TerminalTreat.RepairID = dbo_DefectRow.RepairID) 
     
    	INNER JOIN (Select LastDefectRowID From (SELECT Max(dbo_DefectRow.DefectRowID) AS LastDefectRowID, dbo_DefectRow.RepairID FROM dbo_DefectRow GROUP BY dbo_DefectRow.RepairID)) AS sq_DefectRowIDGroupByRepairID
    	ON sq_DefectRowIDGroupByRepairID.LastDefectRowID = dbo_DefectRow.DefectRowID
    WHERE 
    (
    	(
      	dbo_TerminalRepair.RepairID In 
        (
        	Select RepairID From  
    				(
        			SELECT dbo_TerminalRepairStock.RepairID, TypeStock
            	FROM dbo_TerminalRepairStock, 
            	(
        	    	SELECT dbo_TerminalRepairStock.RepairID, Max(dbo_TerminalRepairStock.DateIN) As MaxDateIn
        	    	FROM dbo_TerminalRepairStock
        	    	GROUP BY dbo_TerminalRepairStock.RepairID
        	    ) AS LastStock
        	    WHERE 
       	     (
       		     	(dbo_TerminalRepairStock.RepairID=LastStock.RepairID) AND 
       		     	(LastStock.MaxDateIn=dbo_TerminalRepairStock.DateIN)
       	     )
    				)  AS Q_SelectLastTerminalStock WHERE TypeStock = 'Defective'
    		)
    	) 
    );
    C'est pour cela que j'ai décidé d'ajouter un IN au lieu du INNER JOIN. Mais ça fait planter Access...

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    226
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2008
    Messages : 226
    Points : 114
    Points
    114
    Par défaut

    J'ai essayé avec Exists, mais c'est la même chose... Access part en erreur et se ferme dés que j'essaye d'exécuter la requête.
    Quelqu'un a une autre solution à me proposer??

Discussions similaires

  1. Lenteur sur une requête avec jointure
    Par mister3957 dans le forum SQL
    Réponses: 16
    Dernier message: 13/08/2008, 13h10
  2. Je recherche de l'aide sur une requête avec dates
    Par Alain CARDINI dans le forum Requêtes et SQL.
    Réponses: 7
    Dernier message: 22/05/2008, 22h11
  3. [SQL] Erreur sur une requète avec un Like
    Par heruwenli dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 30/05/2007, 14h29
  4. Réponses: 5
    Dernier message: 06/01/2007, 04h48
  5. [VBA] Erreur sur une requête avec un opérateur
    Par elgringo2007 dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/07/2006, 17h12

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