2011-09-14 41 views
8

Sử dụng MS Access. Tôi xin lỗi rằng tiêu đề là mơ hồ - tôi chỉ không biết chính xác làm thế nào để mô tả loại vấn đề này là gì, tôi chỉ biết rằng tôi cần phải tham gia hai bảng hoặc truy vấn để giải quyết nó.Truy cập câu hỏi SQL tham gia

Tôi có một bảng OrgHistory cho thấy mà tổ chức mỗi người (bằng ID) tham gia vào một ngày nhất định (bạn chỉ có thể là một thành viên của một org tại một thời điểm):

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

Tôi cũng có một Activities bảng:

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

tôi muốn tìm hiểu, cho mỗi bản ghi trong Activities, mà tổ chức người là thành viên của hành kể từ ngày hoạt động. Tôi nghĩ rằng điều này có thể liên quan đến việc chuyển đổi các giá trị JoinDate thành một tập hợp các dải và phù hợp với khoảng thời gian thích hợp, nhưng tôi hơi bối rối về cách thiết kế truy vấn trong trường hợp này - cách tạo phạm vi và khớp giá trị riêng lẻ cho một phạm vi?

Tôi không nghĩ rằng partition() sẽ hoạt động vì tôi không cố gắng giữ nhiều giá trị JoinDate trong số lượng đã biết của nhóm.

+0

Tôi đồng ý 'OrgHistory' bảng của bạn thiếu một' thuộc tính LeaveDate': bạn nên thêm cột 'LeaveDate' mới vào bảng cơ sở của bạn, thêm khóa được sắp xếp để đảm bảo các dấu chấm không thể trùng lặp cho cùng một người (gợi ý: bạn cần ràng buộc' CHECK'), sau đó chà dữ liệu ** một lần ** (@ Banjoe's truy vấn có vẻ đầy hứa hẹn cho điều này). – onedaywhen

+0

+1 @onedaywhen - để sử dụng ngày nghỉ thay vì boolean hoạt động/không hoạt động. Nhiều người không xem xét phải quay lại lịch sử để tìm kiếm tư cách thành viên. – JeffO

Trả lời

5

Tôi không thể hứa hẹn đây là cách hiệu quả nhất, nhưng nó hoạt động trong Access với dữ liệu thử nghiệm bạn cung cấp:

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

cảm ơn! ý tưởng hay về việc lấy ngày thành viên cao nhất là <= ngày hoạt động, điều đó có ý nghĩa rất nhiều. – sigil