2012-11-08 52 views
5

假設我有一個名爲tbl_med的表,它有六個字段:[nom_lab],[nom_desc],[nom_apres],[date_vig],[cod_med],[vr_pmc ]。我想了解一個Microsoft Access嚮導生成的查詢

我想一個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

從本質上講,這三個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只是一個棘手的語言,有時會讓你頭腦發熱,並且像任何語言(無論是編程語言還是口頭語言)都需要時間來學習它的模式和細微差別,然後才能輕鬆閱讀它。