假设我有一个名为tbl_med的表,它有六个字段:[nom_lab],[nom_desc],[nom_apres],[date_vig],[cod_med],[vr_pmc]。
我想要一个MS Access SQL查询:
我使用了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
条件是必要的吗?
有没有人有更直观的查询更容易理解?
答案 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只是一种棘手的语言,有时可以解决问题,就像任何语言(无论是编程语言还是口语)一样,在您轻松阅读之前,需要花时间学习它的模式和细微差别。