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

Nat*_*tBr 5 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. 显示所有六个字段(不仅仅是用于检查重复字段的字段).

我使用MS Access"查找重复查询向导",它给了我以下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
Run Code Online (Sandbox Code Playgroud)
    And [nom_desc] = [tbl_med].[nom_desc] 
    And [nom_apres] = [tbl_med].[nom_apres]
    And [date_vig] = [tbl_med].[date_vig]
Run Code Online (Sandbox Code Playgroud)
)
ORDER BY tbl_med.[nom_lab], tbl_med.[nom_desc], tbl_med.[nom_apres], tbl_med.[date_vig];
Run Code Online (Sandbox Code Playgroud)

谁能解释为什么And上面的水平规则线之间的三个条件是必要的?

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

Lok*_*rim 1

本质上,这三个And子句之所以存在,是因为您告诉查询向导您不仅要检查字段上的重复项[nom_lab],还要检查[nom_desc][nom_apres][date_vig]字段上的重复项(正如您在问题开头所述)。

子查询的部分SELECT [nom_lab] FROM [tbl_med] As Tmp ... HAVING Count(*)>1告诉它查找具有重复[nom_lab]值的记录。然后,这些And子句通过实际上说“除了具有重复[nom_lab]值之外,我只想查看在所有其他三个字段([nom_desc][nom_apres][date_vig])中也有重复的记录”来满足您请求的其余重复标准。

因此,为了回答你的第二个问题,我真的不明白你如何才能迫使它变得更加直观。SQL 只是一种有时很难让您理解的语言,并且像任何语言(无论是编程语言还是口语)一样,需要时间来学习它的模式和细微差别,然后才能轻松地阅读它。