2017-09-21 6 views
0

J'ai deux tables un pour stocker les dates de mont et d'autres pour garder les détails de présence des employésjointure externe gauche ne fait pas afficher prévu dans Postgres

dans mon état la table attendance_days a 31 enregistrements dans le tableau de présence des employés un employé possède 29 et un autre employé 8 Nombre total de fiches 37 fiches données comme suit

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');` 

première table ont 31 enregistrements (31 jours NOV) deuxième table ont 37 enregistrements (29 fiches pour employee_id 407 et 8 record pour employee_id 601

J'ai exécuté la requête suivante

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

Il retourne seulement 37 lignes, mais je m'y attendais 62 lignes (31 lignes chacune pour les employés)

Je ne comprends pas la question

+3

Pouvez-vous expliquer pourquoi vous attendez 62 lignes? –

+0

dans la première table 31 lignes et deuxième table, deuxième table ont des enregistrements de deux employés –

Répondre

0

postgres trouve une ligne correspondante pour chaque identifiant de attendance_days, donc il n'y a aucune raison de créer protheses l hits (qui ressembleraient à "id, attendance_date, null, null, null, null, null").

Vous attendez en fait un résultat comme "id, attendance_date, null, null, id_employé, null, null".

Vous devrez donc créer un produit cartésien de attendance_days.id et de employee_id (de la "table des employés") qui vous donne toutes les combinaisons des deux (62 lignes). Ce produit cartésien peut être joint à la table employee_attendance pour obtenir le résultat requis.

+0

Mais si je supprime les enregistrements de employee_id 407 de la table employee_attendance, il affichera 31 enregistrements –

+0

Oui, 6 lignes qui ont un ID correspondant et 25 lignes avec id qui ne correspondent pas. Vous attendez un jeu de résultats avec la liste complète des attendance_days pour chaque employee_id et, éventuellement, l'heure de début et de fin. Cela signifie que chaque ligne doit au moins afficher: attendance_day.id, attendance_date _and_ the employee_id. – Ronald

+0

oui, besoin de 31 jours de résultat pour tous les employés –