我想了解Microsoft Access向导生成的查询

时间:2012-11-08 12:18:55

标签: ms-access duplicate-data

假设我有一个名为tbl_med的表,它有六个字段:[nom_lab],[nom_desc],[nom_apres],[date_vig],[cod_med],[vr_pmc]。

我想要一个MS Access SQL查询:

  1. 查找与四个字段相关的重复记录:[nom_lab],[nom_desc],[nom_apres],[date_vig]。
  2. 显示所有六个字段(不仅仅是用于检查重复字段的字段)。
  3. 我使用了MS Access“Find Duplicates Query Wizard”,它给了我以下SQL:

    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];
    

    有人可以解释为什么上面的水平规则行之间的三个And条件是必要的吗?

    有没有人有更直观的查询更容易理解?

1 个答案:

答案 0 :(得分:1)

基本上,有三个And子句,因为您告诉查询向导,您不仅要检查[nom_lab]字段上的重复项,还要检查[nom_desc]上的重复项{ {1}}和[nom_apres]字段(正如您在问题开头所述)。

子查询的[date_vig]部分告诉它查找具有重复SELECT [nom_lab] FROM [tbl_med] As Tmp ... HAVING Count(*)>1值的记录。然后,[nom_lab]条款通过实际说明“除了具有重复的And值之外的其他所请求的重复条件,我希望只查看在所有这三个其他字段中也有重复的记录([nom_lab][nom_desc][nom_apres])也是如此。“

所以回答你的第二个问题,我真的看不出你怎么能强迫它更直观。 SQL只是一种棘手的语言,有时可以解决问题,就像任何语言(无论是编程语言还是口语)一样,在您轻松阅读之前,需要花时间学习它的模式和细微差别。