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 Inter tables avec exclusions sans résultat


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut Requête Inter tables avec exclusions sans résultat
    Bonjour,

    J'ai un soucis: Je souhaite effectuer une requête renvoyant tous les résultats sauf ceux qui sont présents dans une table autre (elle issue d'une autre requête).

    Seulement, je n'ai aucun résultats.


    La requête permettant de renvoyer les résultats de la table autre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    sive2 = "SELECT  [Parc Z2N].Rame_Complète, defauts_NAT.Date, [Parc Z2N].Ets_Propriétaire"
    sive2 = sive2 & " FROM listing_defauts INNER JOIN (defauts_NAT INNER JOIN [Parc Z2N] ON defauts_NAT.Véhicule = [Parc Z2N].véhicule) ON listing_defauts.Code = defauts_NAT.code_defaut"
    sive2 = sive2 & " GROUP BY [Parc Z2N].Rame_Complète, defauts_NAT.Date, listing_defauts.vrai_defaut, [Parc Z2N].Ets_Propriétaire, [Parc Z2N].Série, defauts_NAT.exploitation"
    sive2 = sive2 & " HAVING (((defauts_NAT.Date)<#" & Format(Now(), "mm/dd/yy") & "# AND (defauts_NAT.Date)>=#" & Format(DateAdd("d", 1, date_maj), "mm/dd/yyyy") & "#) AND ((listing_defauts.vrai_defaut)=True)) AND (([Parc Z2N].Série = ""Z20500"") OR ([Parc Z2N].Série = ""Z5600"") OR ([Parc Z2N].Série = ""Z8800"")) AND ((defauts_NAT.exploitation)=True)"
    Set rs_sive2 = CurrentDb.OpenRecordset(sive2)
    Cette requête fonctionne et me renvoie un certains nombres de résultats dans la table "test_alerte_Z2N".



    Voici mon autre requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SQL_Def_com = "SELECT [Parc Z2N].Rame_Complète, rentrée.[Date], [Parc Z2N].Série, [Parc Z2N].Ets_Propriétaire"
    SQL_Def_com = SQL_Def_com & " FROM (rentrée INNER JOIN [Parc Z2N] ON rentrée.Rame = [Parc Z2N].Rame_Complète) INNER JOIN test_alerte_Z2N ON test_alerte_Z2N.rame = [Parc Z2N].rame_complète"
    SQL_Def_com = SQL_Def_com & " GROUP BY [Parc Z2N].Rame_Complète, rentrée.[Date], [Parc Z2N].Série, [Parc Z2N].[Système CAVE], [Parc Z2N].Ets_Propriétaire, test_alerte_Z2N.rame"
    SQL_Def_com = SQL_Def_com & " HAVING [Parc Z2N].[Système CAVE] = '" & "ACOREL" & "' AND [Parc Z2N].rame_complète <> test_alerte_Z2N.rame"
    SQL_Def_com = SQL_Def_com & " ORDER BY rentrée.[Date] "
    Set rs_SQL_Def_com = CurrentDb.OpenRecordset(SQL_Def_com)
    Ou la table autre est en fait "test_alerte_Z2N".

    Je souhaite donc avoir tous les résultats sauf ceux qui se trouvent au moment m dans la table "test_alerte_Z2N", donc comme une sorte d'exclusion quoi...

    seulement, écrite comme ça, cette requête ne me renvoit rien, quelqu'un aurait-il une idée de comment s'y prendre ?

    Merci d'avance !

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    J'ai essayé ceci via le constructeur de requête d'Access:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [Parc Z2N].Rame_Complète, rentrée.Date, [Parc Z2N].Ets_Propriétaire
    FROM ([Parc Z2N] INNER JOIN test_alerte_Z2N ON [Parc Z2N].rame_complète = test_alerte_Z2N.rame) INNER JOIN rentrée ON [Parc Z2N].Rame_Complète = rentrée.Rame
    GROUP BY [Parc Z2N].Rame_Complète, rentrée.Date, [Parc Z2N].Ets_Propriétaire, [Parc Z2N].[Système CAVE], test_alerte_Z2N.Rame
    HAVING  ((([Parc Z2N].[Système CAVE])='" & "ACOREL" & "') AND ([Parc Z2N].rame_complète NOT IN (SELECT test_alerte_Z2N.rame FROM test_alerte_Z2N)))
    ORDER BY rentrée.Date;
    Sans plus de résultats ...

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    Ah, je pense tenir quelque chose !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT [Parc Z2N].Rame_Complète, rentrée.Date, [Parc Z2N].Ets_Propriétaire
    FROM [Parc Z2N] INNER JOIN rentrée ON [Parc Z2N].Rame_Complète = rentrée.Rame
    GROUP BY [Parc Z2N].Rame_Complète, rentrée.Date, [Parc Z2N].Ets_Propriétaire, [Parc Z2N].[Système CAVE]
    HAVING ((([Parc Z2N].Rame_Complète) Not In (SELECT test_alerte_Z2N.rame FROM test_alerte_Z2N)) AND (([Parc Z2N].[Système CAVE])="ACOREL"))
    ORDER BY rentrée.Date;
    Cette requête me renvoi des résultats qui semblent cohérents, malheureusement, la situation actuelle (le remplissage de la table "test_alerte_Z2N") n'est pas optimale pour vérifier le bon fonctionnement de cette requête.


    Je laisse ce sujet en Stand By, et je reviens pour faire un point, je ne pourrais faire ça que chaque jour.

  4. #4
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonjour Warwolf,


    Ce qui se conçoit bien s’énonce clairement...


    Votre requête est pour le moins absconse, nous n’en donnez ni les tenants ni les aboutissants, aussi pourriez-vous traduire en français, de façon précise, ce que vos cherchez à faire ? Cela commence par la présentation de la structure des tables et de leurs relations.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Je sais que c'est pas très clair, mais si je donnais le tout, ça le serait encore moins.

    Ce que je souhaitais faire, c'est que dans un premier temps, via une requête A, je souhaitais récupérer uniquement les rames de ma flotte qui ont communiqué pendant leur exploitation, je les mettais dans une table A (j'excluais donc celles qui auraient communiqué hors exploitation et celles qui n'ont pas communiqué du tout[peu importe si elles étaient ou non en exploitation]).
    Et le truc, c'est que dans un deuxième temps, je souhaitais récupérer les rames qui n'ont pas communiqué lors de leur exploitation (alors qu'elle devaient communiqué un code en particulier) via une requête B, sauf que je ne voulais pas les rames qui étaient déjà présentes dans ma première table, sous peine de créer des doublons.

    Je voulais donc une solution pour arriver à exclure les résultats de ma table A dans ma requête B.

    Ceci dit, mon dernier message reprends une solution qui fonctionne pour mon problème.

    Il m'arrive souvent de trouver tout seul la solution au final, mais je viens solliciter ici une aide ou des avis extérieurs car je ne suis pas un monstre d'access.

  6. #6
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonjour Warwolf,


    Avant de parler du COMMENT, parlons du QUOI. Si je comprends bien, vous gérez une flotte de rames (engins roulants) qui communiquent (émettent des signaux).

    Au stade SQL, vous disposez d’une table [Parc Z2N] laquelle, je suppose, est constituée de l’ensemble (ou d'un sous-ensemble) des rames de la flotte.

    Vous disposez d’une table [test_alerte_Z2N] : quelle est sa finalité ? S’agit-il des rames ayant communiqué ? (D’où le NOT IN de la clause HAVING ?)

    A quoi correspond la table [rentrée] ?


    Ne sont concernées dans l’opération que les rames "ACOREL".

    Indépendamment du NOT IN, quel est le rôle de base de la clause HAVING dans votre requête ? Éliminer les doublons ?

    L’objet de votre requête est-il le suivant :

    Quelles sont les rames "ACOREL" rentrées et ayant communiqué ?

    Si ça n'est pas cela, merci de rédiger uniquement en français ce que vous souhaitez obtenir.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    vous avez raison, posons les bases:

    - La table "rentrée" correspond aux données d'exploitation de toutes les rames de la flotte (les trajets commerciaux donc)

    Ces données me permettent d'appliquer un filtre sur les défauts que j'exporte dans une autre table "Defauts_NAT" afin de faire ressortir seulement ceux qui seraient apparus lors de ces trajets commerciaux.

    - La table "Parc Z2N" correspond à la grosse aux immatriculations et toutes les données techniques liées à mes rames.

    - "Test_alerte_Z2N" est une table intermédiaire dans laquelle se retrouve toutes mes rames ayant communiqué des défauts durant leur trajets commerciaux que je vais sélectionner pour emmètre des formulaires d'alertes défauts.

    - "Acorel" est un système présent uniquement dans quelques rames de la flotte.



    AU FINAL: Le but de ma manoeuvre est de faire ressortir les rames comprenant le système Acorel qui ont effectué des trajets commerciaux MAIS QUI N'ONT PAS communiqué un seul défauts.

    En temps normal, ces dites rames doivent dans leur fonctionnement normal emmètre un code "AC-121" signalisant l'envoi d'un fichier.

    Et ici, ma clause HAVING sert plutôt à supprimer les rames comprenant le système Acorel MAIS QUI AURAIT COMMUNIQUE au moins 1 défaut.
    Ces dernières rames sont traitées et prises en comptes dans un autre programme et sont stockées dans la table "test_alerte_Z2N".


    EN CLAIR: Je veux TOUTES les rames comprenant le système ACOREL mais SANS celles qui sont présentes dans "TEST_ALERTE_Z2N".



    J'espère que c'est plus clair énoncé de cette manière. Sachez quand même que ma dernière solution postée fonctionne pour mon problème.

    Cordialement.

  8. #8
    Expert éminent sénior
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 002
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 002
    Points : 30 906
    Points
    30 906
    Billets dans le blog
    16
    Par défaut
    Bonjour Warwolf,



    Citation Envoyé par Warwolf
    Le but de ma manoeuvre est de faire ressortir les rames comprenant le système Acorel qui ont effectué des trajets commerciaux MAIS QUI N'ONT PAS communiqué un seul défauts.

    Je veux TOUTES les rames comprenant le système ACOREL mais SANS celles qui sont présentes dans "TEST_ALERTE_Z2N".

    "ACOREL" est a priori une valeur permettant de bien filtrer, aussi est-il préférable de faire agir au plus tôt la partie « ParcZ2N.systemeCave="ACOREL », ce qui n’et pas le cas dans votre requête.

    On devrait pouvoir coder plus simplement (et de façon bien plus performante ainsi) :

    
    SELECT DISTINCT ParcZ2N.rame_complete, rentree.Date, ParcZ2N.ets_proprietaire
    FROM   ParcZ2N INNER JOIN rentree ON ParcZ2N.rame_Complete = rentree.rame
    WHERE  ParcZ2N.systemeCave = 'ACOREL' 
      AND  NOT EXISTS (SELECT ''
                      FROM    test_alerte_Z2N
                      WHERE   ParcZ2N.Rame_Complete = test_alerte_Z2N.rame)   
    ORDER BY rentree.Date;
    
    
    La colonne systemeCave de la table ParcZ2N doit évidemment être indexée pour rendre performante la partie « ParcZ2N.systemeCave="ACOREL ».

    La clause DISTINCT peut être ôtée si la clé primaire de la table rentree est la paire {rame, date}.
    (a) Faites simple, mais pas plus simple ! (A. Einstein)
    (b) Certes, E=mc², mais si on discute un peu, on peut l’avoir pour beaucoup moins cher... (G. Lacroix, « Les Euphorismes de Grégoire »)
    => La relativité n'existerait donc que relativement aux relativistes (Jean Eisenstaedt, « Einstein et la relativité générale »)

    __________________________________
    Bases de données relationnelles et normalisation : de la première à la sixième forme normale
    Modéliser les données avec MySQL Workbench
    Je ne réponds pas aux questions techniques par MP. Les forums sont là pour ça.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2015
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2015
    Messages : 73
    Points : 46
    Points
    46
    Par défaut
    Bonjour,
    Ah, je pense tenir quelque chose !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part

    1
    2
    3
    4
    5


    SELECT [Parc Z2N].Rame_Complète, rentrée.Date, [Parc Z2N].Ets_Propriétaire
    FROM [Parc Z2N] INNER JOIN rentrée ON [Parc Z2N].Rame_Complète = rentrée.Rame
    GROUP BY [Parc Z2N].Rame_Complète, rentrée.Date, [Parc Z2N].Ets_Propriétaire, [Parc Z2N].[Système CAVE]
    HAVING ((([Parc Z2N].Rame_Complète) Not In (SELECT test_alerte_Z2N.rame FROM test_alerte_Z2N)) AND (([Parc Z2N].[Système CAVE])="ACOREL"))
    ORDER BY rentrée.Date;

    Cette requête me renvoi des résultats qui semblent cohérents, malheureusement, la situation actuelle (le remplissage de la table "test_alerte_Z2N") n'est pas optimale pour vérifier le bon fonctionnement de cette requête.

    Cette solution, bien que brouillone, fonctionne pour mon problème.

    Ne continuez pas de vous triturer l'esprit !

    Vous remerciant de l'intérêt que vous avez porté à mon problème !

Discussions similaires

  1. 1 requête , 2 tables avec sources différentes
    Par caballero dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/06/2007, 10h47
  2. [Requête] 2 tables avec relations un à plusieurs
    Par egg3774 dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 02/05/2007, 14h42
  3. Croisement de table avec exclusion
    Par daveInIreland dans le forum Requêtes
    Réponses: 1
    Dernier message: 05/04/2007, 15h53
  4. [Access 2003] Sélection d'un table avec exclusion
    Par morpheez dans le forum Langage SQL
    Réponses: 6
    Dernier message: 11/11/2006, 11h16
  5. Requête 2 tables avec dates
    Par Flam dans le forum Requêtes
    Réponses: 11
    Dernier message: 22/06/2006, 09h42

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