2012-11-08 13 views
5

Załóżmy, że mam tabelę o nazwie tbl_med, która ma sześć pól: [nom_lab], [nom_desc], [nom_apres], [date_vig], [cod_med], [vr_pmc ].Chciałbym zrozumieć zapytanie generowane przez Kreatora Microsoft Access:

Chcę kwerendy MS Access SQL, który będzie:

  1. Znajdź zduplikowane rekordy w stosunku do czterech dziedzin: [nom_lab], [nom_desc], [nom_apres], [date_vig].
  2. Pokaż wszystkie sześć pól (nie tylko te używane do sprawdzania duplikatów).

Użyłem MS Access "Znajdź Kreatora kwerend duplikatów", który dał mi następujący 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]; 

Czy ktoś może wyjaśnić, dlaczego trzy And warunki między poziomymi liniami reguł powyżej są konieczne?

Czy ktoś ma bardziej intuicyjne zapytanie, które byłoby łatwiejsze do zrozumienia?

+4

Są one konieczne, ponieważ zapytanie musi odnosić się do wersji sumarycznej w celu ustalenia, czy liczba każdego rekordu jest większa niż 1, a zatem jest duplikatem. Polecam trzymać się z kreatorem dla tego typu kolejek. –

Odpowiedz

1

Zasadniczo trzy And klauzule są tam dlatego, że powiedziano kreatora zapytań, które chciałem sprawdzić duplikatów nie tylko na polu [nom_lab], ale także na [nom_desc], [nom_apres] i [date_vig] dziedzinach (jak podano na początku twojego pytania).

Część podkwerendy informuje, aby wyszukać rekordy, które mają zduplikowane wartości: [nom_lab]. Klauzule And spełniają następnie pozostałe wymagane kryteria duplikacji, mówiąc w efekcie: "oprócz posiadania duplikatów wartości [nom_lab], chcę zobaczyć tylko te rekordy, które również mają duplikację we wszystkich trzech pozostałych polach ([nom_desc], [nom_apres] i [date_vig]) także."

Więc, aby odpowiedzieć na twoje drugie pytanie, naprawdę nie widzę, jak możesz zmusić go do większej intuicji. SQL jest po prostu trudnym językiem, by czasem się połapać, i jak każdy język (czy to język programowania czy mówiony), zanim nauczysz się go łatwo odczytać jego wzory i niuanse, potrzeba czasu, by nauczyć się jego wzorów i niuansów.