2016-11-13 1 views
0

J'ai relations suivantes dans ma base de données: relationsObtenir toutes les entrées qui ne correspondent pas à travers une table de liaison en ms accès

Il existe différentes formations dans une entreprise et ils sont répétées comme 2-3 fois par an.

Maintenant, je veux obtenir toutes les entrées tbl_events auxquelles une entrée tbl_employee n'a aucun rapport et les afficher dans un rapport. Jusqu'ici, j'ai essayé de faire une requête me donnant tous les employés avec le nom d'ev qu'ils ont déjà visité.

qry_visited:

SELECT tbl_employee.em_number 
    ,tbl_event.ID AS ev_visited_id 
FROM (
    tbl_event INNER JOIN tbl_date ON tbl_event.[ID] = tbl_date.[da_f_event] 
    ) 
INNER JOIN (
    tbl_employee INNER JOIN tbl_training ON tbl_employee.[ID] = tbl_training.[tr_f_employee] 
    ) ON tbl_date.[ID] = tbl_training.[tr_f_date]; 

Et puis j'ai écrit une deuxième requête: qry_unvisited

SELECT qry_visited.em_number 
    ,tbl_event.ev_name 
    ,qry_visited.ev_visited_id 
FROM qry_visited 
RIGHT JOIN tbl_event ON qry_visited.ev_visited_id = tbl_event.ID 
WHERE (((qry_visited.ev_visited_id) IS NULL)); 

Ces requêtes ne fonctionnent que ensemble, si je limite le premier à un seul employé. Je préférerais avoir un jeu d'enregistrements avec em_number et ev_name pour tous les employés.

J'ai aussi fait des recherches pendant quelques jours sur le travail avec (et en travaillant autour) LEFT OUTER, RIGHT OUTER et FULL OUTER JOIN, mais aucun n'a fait l'affaire.

Merci pour votre aide!

modifier 1

Exemple: Il y a 3 employés (emp1, emp2, epm3) et 3 événements (EV1, EV2, EV3)

Disons que

  • emp1 visité ev1 et ev2
  • emp2 visité ev2 et ev3
  • emp3 visité aucun jusqu'à présent

Je veux que mon résultat à ressembler à ceci:

| employee | not visited events | 
    emp1  ev3 
    emp2  ev1 
    emp3  ev1 
    emp3  ev2 
    emp3  ev3 

Répondre

1

Cela devrait vous donner une liste des événements sans employés connexes.

SELECT DISTINCTROW tbl_event.* 
FROM ((tbl_event 
LEFT JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event) 
LEFT JOIN tbl_training ON tbl_date.ID = tbl_training.tr_f_date) 
LEFT JOIN tbl_employee ON tbl_training.tr_f_employee = tbl_employee.ID 
WHERE tbl_employee.ID IS NULL 

Si je comprends bien, ce que vous voulez est toutes les combinaisons d'événements-employés éventuels, à l'exception ceux qui se sont produits réellement.

Quelque chose comme ceci:

SELECT possibles.* 
FROM (
    SELECT tbl_event.ID AS eventID, tbl_employee.ID AS empID 
    FROM tbl_event, tbl_employee 
) AS possibles 
LEFT JOIN (
    SELECT tbl_date.da_f_event AS eventID, tbl_training.tr_f_employee AS empID 
    FROM tbl_date 
    INNER JOIN tbl_training ON tbl_date.ID = tbl_training.tr_f_date 
) AS actuals ON possibles.eventID = actuals.eventID AND possibles.empID = actuals.empID 
WHERE actuals.eventID IS NULL 

Vous pouvez ajouter des champs de tbl_event et tbl_employee à la sous-requête possibles.


Voici un description informelle des types de jointure:

INNER JOIN

Comprend uniquement les enregistrements qui match sur les deux côtés de la jointure; de dupliquer les enregistrements pour plusieurs correspondances

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event 
INNER JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event 

LEFT JOIN

Comprend tous les enregistrements de la première table, et uniquement les enregistrements, quel match de la deuxième table. Les colonnes de deuxième table pour les lignes sans correspondance dans la seconde table auront la valeur NULL. Duplique les enregistrements pour plusieurs correspondances.

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event 
LEFT JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event 

(Il y a aussi RIGHT JOIN, qui fait la même chose, sauf qu'il renverse l'ordre des tables. Je ne l'ai pas encore trouvé une bonne raison d'utiliser RIGHT JOIN, donc je vous suggère de l'éviter.)

FULL OUTER JOIN (non pris en charge par MS Access)

Comprend tous les enregistrements des deux tables même quand il n'y a pas de correspondance pour un enregistrement donné de l'autre côté de la jointure. Duplique les enregistrements pour plusieurs correspondances.

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event 
FULL OUTER JOIN tbl_date ON tbl_event.ID = tbl_date.da_f_event 

Cross rejoindre, Alias ​​produit cartésien

Comprend chaque enregistrement de la première table pour chaque enregistrement de la deuxième table.

SELECT tbl_event.*, tbl_date.* 
FROM tbl_event, tbl_date 
+0

Tout d'abord: Merci pour votre effort. Malheureusement, je n'ai pas besoin des événements généralement "inutilisés" mais des événements inutilisés par employé. Je vais modifier la question en conséquence, pour le rendre plus clair ... – Argee

+0

@Argee Mis à jour. –

+0

Vous, monsieur, êtes une bouée de sauvetage! Merci beaucoup :) – Argee