2017-09-21 12 views
0

포스트 그레스에서 예상 된 결과가 표시되지 않습니다 가입 왼쪽는 외부 I 직원</p> 내 상태 <p>attendance_days 테이블이 직원의 출석 테이블 (31 개) 기록 을 가지고의 출석 세부 사항을 유지하기위한 몽의 날짜를 저장하는 두 개의 테이블을 가지고 다른

create table attendance_days 
(id serial primary key not null, 
attendance_date date); 



INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-01'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-02'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-03'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-04'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-05'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-06'); 

INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-07'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-08'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-09'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-10'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-11'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-12'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-13'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-14'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-15'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-16'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-17'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-18'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-19'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-20'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-21'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-22'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-23'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-24'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-25'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-26'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-27'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-28'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-29'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-30'); 
INSERT INTO attendance_days (attendance_date) VALUES ('2017-08-31');` 

`

create table employee_attendance 
(id serial primary key not null, 
attendance_day_id integer , 
employee_id integer, 
first_in_time timestamp, 
last_out_time timestamp); 


INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (1, 407, '2017-08-01 09:30:00', '2017-08-01 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (2, 407, '2017-08-02 09:30:00', '2017-08-02 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (3, 407, '2017-08-03 09:30:00', '2017-08-03 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (4, 407, '2017-08-04 09:30:00', '2017-08-04 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (5, 407, '2017-08-05 09:30:00', '2017-08-05 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (6, 407, '2017-08-06 09:30:00', '2017-08-06 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (7, 407, '2017-08-07 09:30:00', '2017-08-07 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (8, 407, '2017-08-08 09:30:00', '2017-08-08 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (9, 407, '2017-08-09 09:30:00', '2017-08-09 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (12, 407, '2017-08-12 09:30:00', '2017-08-12 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (13, 407, '2017-08-13 09:30:00', '2017-08-13 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (14, 407, '2017-08-14 09:30:00', '2017-08-14 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (15, 601, '2017-08-15 10:44:40', '2017-08-15 10:47:36'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (15, 407, '2017-08-15 09:30:00', '2017-08-15 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (16, 407, '2017-08-16 09:30:00', '2017-08-16 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (17, 407, '2017-08-17 09:30:00', '2017-08-17 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (18, 407, '2017-08-18 09:30:00', '2017-08-18 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (18, 601, '2017-08-18 08:12:41', '2017-08-19 07:57:12'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (19, 601, '2017-08-19 07:57:12', '2017-08-19 20:14:01'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (19, 407, '2017-08-19 09:30:00', '2017-08-19 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (20, 407, '2017-08-20 09:30:00', '2017-08-20 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (21, 407, '2017-08-21 09:30:00', '2017-08-21 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (22, 601, '2017-08-22 08:07:00', '2017-08-22 20:43:10'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (22, 407, '2017-08-22 09:30:00', '2017-08-22 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (23, 407, '2017-08-23 09:30:00', '2017-08-23 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (24, 407, '2017-08-24 09:30:00', '2017-08-24 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (24, 601, '2017-08-24 08:06:58', '2017-08-24 20:03:44'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (25, 407, '2017-08-25 09:30:00', '2017-08-25 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (26, 601, '2017-08-26 09:14:24', '2017-08-26 20:21:32'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (26, 407, '2017-08-26 09:30:00', '2017-08-26 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (27, 407, '2017-08-27 09:30:00', '2017-08-27 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (27, 601, '2017-08-27 08:48:09', '2017-08-28 07:55:24'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (28, 407, '2017-08-28 09:30:00', '2017-08-28 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (29, 407, '2017-08-29 09:30:00', '2017-08-29 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (29, 601, '2017-08-29 08:09:44', '2017-08-29 20:04:26'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (30, 407, '2017-08-30 09:30:00', '2017-08-30 20:00:00'); 
INSERT INTO employee_attendance(attendance_day_id, employee_id, first_in_time, last_out_time) VALUES (31, 407, '2017-08-31 09:30:00', '2017-08-31 20:00:00');` 
다음과 같이 하나 명의 직원은 29가 다른 8 개 직원 레코드 (37) 기록 데이터를 전체 7백45경1천5백15조5백36억9천1백36만3천2백10

제 테이블 그것만 37 반환 31 개 기록

601 I 다음 쿼리

SELECT * 
FROM attendance_days 
    LEFT OUTER JOIN employee_attendance 
       ON employee_attendance.attendance_day_id = attendance_days.id 

실행 37 개 레코드 (employee_id입니다 407 29 개 기록과 employee_id입니다 8 레코드가 두 번째 테이블 (8 월 31 일)이 행,하지만 난 문제를 이해할 수 없다

(31 행 직원 각각) 62 개 행을 예상

+3

62 행을 예상하는 이유를 설명 할 수 있습니까? –

+0

첫 번째 테이블 31 행 및 두 번째 테이블, 두 번째 테이블에 두 명의 직원 기록이 있습니다 –

답변

0

포스트 그레스 는 attendance_days의 각 ID에 대한 일치하는 행을 발견, 그래서 artificia를 만들 이유가 없다 l 히트 ("id, attendance_date, null, null, null, null, null"처럼 보일 것입니다).

"id, attendance_date, null, null, employee_id, null, null"과 같은 결과가 실제로 나타납니다.

그래서 두 개의 모든 조합 (62 행)을 제공하는 attendance_days.id 및 employee_id의 직교 좌표 곱을 작성해야합니다 (직원 테이블에서). 이 직교 좌표계는 employee_attendance 테이블과 외부 조인을 통해 필요한 결과를 얻을 수 있습니다.

+0

하지만 employee_id 407의 레코드를 employee_attendance 테이블에서 제거하면 31 개의 레코드가 표시됩니다 –

+0

예, 일치하는 ID가있는 6 개의 행과 25 개의 행 id가 일치하지 않습니다. 각 employee_id에 대한 전체 attendance_days 목록과 함께 시작 및 종료 시간 (선택 사항)이 포함 된 결과 집합이 필요합니다. 이는 각 행에 최소한 attendance_day.id, attendance_date _and_ employee_id가 표시되어야 함을 의미합니다. – Ronald

+0

예, 모든 직원에 대해 31 일 결과가 필요합니다. –