5

假设我有一个名为 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

    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上面水平规则线之间的三个条件是必要的?

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

4

1 回答 1

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 有时只是一种难以理解的语言,并且像任何语言(无论是编程语言还是口语)一样,在您轻松阅读它之前需要时间来学习它的模式和细微差别。

于 2013-01-30T18:37:11.740 回答