2012-11-08 3 views
5

Supposons que j'ai une table nommée tbl_med, qui a six champs: [nom_lab], [nom_desc], [nom_apres], [date_vig], [cod_med], [vr_pmc ]Je voudrais comprendre une requête générée par un assistant Microsoft Access

Je veux une requête SQL MS Access qui:

  1. Trouver des documents dupliqués par rapport à quatre des champs: [nom_lab], [nom_desc], [nom_apres], [date_vig].
  2. Afficher tous les six champs (pas seulement ceux utilisés pour vérifier les doublons).

J'ai utilisé le MS Access "Trouver Doublons Assistant Requête", ce qui m'a donné l'instruction SQL suivante:

SELECT tbl_med.[nom_lab], tbl_med.[nom_desc], tbl_med.[nom_apres], tbl_med.[date_vig], tbl_med.[cod_med], tbl_med.[vr_pmc] 
FROM tbl_med 
WHERE tbl_med.[nom_lab] 
IN 
(
    SELECT [nom_lab] 
    FROM [tbl_med] As Tmp 
    GROUP BY [nom_lab], [nom_desc], [nom_apres],[date_vig] 
    HAVING Count(*)>1 

And [nom_desc] = [tbl_med].[nom_desc] 
    And [nom_apres] = [tbl_med].[nom_apres] 
    And [date_vig] = [tbl_med].[date_vig] 

) 
ORDER BY tbl_med.[nom_lab], tbl_med.[nom_desc], tbl_med.[nom_apres], tbl_med.[date_vig]; 

Quelqu'un pourrait-il expliquer pourquoi les trois And conditions entre les lignes de règles horizontales ci-dessus sont nécessaires?

Est-ce que quelqu'un a une requête plus intuitive qui serait plus facile à comprendre?

+4

Ils sont nécessaires parce que la requête doit se référer à une version de somme de lui-même afin de déterminer si le nombre de chaque enregistrement est supérieur à 1, donc est un doublon. Je recommanderais de rester avec l'assistant pour les Queires de ce type. –

Répondre

1

Essentiellement, les trois And clauses sont là parce que vous avez dit à l'assistant de requête que vous vouliez vérifier les doublons non seulement sur le terrain [nom_lab], mais aussi sur les [nom_desc], [nom_apres] et [date_vig] champs (comme vous l'avez dit au début de votre question).

La partie SELECT [nom_lab] FROM [tbl_med] As Tmp ... HAVING Count(*)>1 de la sous-requête lui demande de rechercher les enregistrements ayant des valeurs [nom_lab] en double. Les clauses And remplissent alors le reste de vos critères de duplication demandés en disant "en plus d'avoir des valeurs [nom_lab] en double, je veux voir seulement les enregistrements qui ont aussi la duplication dans ces trois autres champs ([nom_desc], [nom_apres], et [date_vig]) ainsi que." Pour répondre à votre deuxième question, je ne vois vraiment pas comment vous pourriez le forcer à être plus intuitif. Le langage SQL est parfois un langage compliqué, et comme n'importe quel langage (qu'il s'agisse d'une programmation ou d'une langue parlée), il faut du temps pour apprendre ses schémas et ses nuances avant de pouvoir le lire facilement.