2011-09-14 10 views
8

Korzystanie z MS Access. Przykro mi, że tytuł jest niejasny - po prostu nie wiem dokładnie, jak opisać, jaki jest to problem, po prostu wiem, że muszę dołączyć dwie tabele lub zapytania, aby go rozwiązać.Dostęp do pytania dołączania SQL

Mam OrgHistory tabela, która pokazuje, które organizacja każda osoba (przez ID) dołączył w określonym terminie (można być członkiem tylko jednej org naraz):

Person | Org | JoinDate 
----------------------- 
123 | abc | 3/2/2011 
456 | abc | 4/23/1925 
123 | def | 5/12/2011 

Mam też Activities tabela:

Person | Activity | ActivityDate 
-------------------------------- 
123 | eat  | 3/23/2011 
123 | sleep | 6/25/2011 
456 | walk  | 7/20/1985 

Chcę dowiedzieć się, dla każdego rekordu w Activities, która organizacja osoba była członkiem w dniu działalności. Myślę, że może to obejmować przekształcenie wartości JoinDate w zestaw zakresów i dopasowanie ActivityDate do odpowiedniego przedziału, ale jestem trochę zdezorientowany, jak zaprojektować zapytanie w tym przypadku - w jaki sposób utworzyć zakresy i dopasować indywidualna wartość do zakresu?

Nie sądzę, że partition() będzie działać, ponieważ nie próbuję przechowywać wielu wartości JoinDate w znanej ilości wiader.

+0

zgadzam Twój 'stół OrgHistory' brakuje' LeaveDate' atrybut: ty powinieneś dodać nową kolumnę 'LeaveDate' do swojej tabeli bazowej, dodać sekwencyjny klucz, aby zapewnić, że okresy nie mogą nakładać się na tę samą osobę (wskazówka: potrzebujesz ograniczenia' CHECK'), a następnie szoruj dane ** raz ** (@ Banjoe's zapytanie wygląda obiecująco). – onedaywhen

+0

+1 @onedaywhen - w przypadku użycia daty opuszczenia zamiast wartości aktywnej/innactive boolean. Wiele osób uważa, że ​​nie trzeba wracać historycznie, aby znaleźć członkostwo. – JeffO

Odpowiedz

5

Nie mogę obiecać, że jest to najbardziej skuteczny sposób, ale działa w programie Access z danymi testu podany:

SELECT a.person, a.activity, 
     (
     SELECT TOP 1 org 
      FROM orghistory AS o 
     WHERE o.person = a.person 
       AND o.joindate <= a.activitydate 
     ORDER 
      BY o.joindate DESC 
     ) AS Org 
    FROM activities AS a; 
+0

dzięki! dobry pomysł na przyjęcie daty członkostwa, która jest <= data aktywności, ma wiele sensu. – sigil