J'ai modifié cette question pour la rendre un peu plus concise, si vous voyez mon historique de modification, vous verrez mes efforts et `` ce que j'ai essayé '' mais cela ajoutait beaucoup de bruit inutile et source de confusion, voici donc un résumé des entrées et sorties:
FullName | RequirementTitle --------------------------- Jimmy | Some Requirement Jimmy | Another Requirement John | Some Requirement John | null Becky | null Becky | Another Requirement
Résultat:
People: ID | FullName -------------------- 1 | Jimmy 2 | John 3 | Becky PeopleJobRequirements: ID | PersonId | Title -------------------- 1 | 1 | Some Requirement 2 | 1 | Another Requirement 3 | 2 | Some Requirement 4 | 3 | Another Requirement
Chaque personne a 2 enregistrements, car c'est le nombre d'exigences distinctes qu'il y a dans la table (distinctes en fonction du 'Titre').
Supposons qu'il n'y ait pas de troisième table - les 'PeopleJobRequirements' sont uniques à chaque personne (une personne pour plusieurs exigences) , mais il y aura des titres en double là-dedans (certaines personnes ont les mêmes exigences de travail).
Toutes nos sincères excuses pour toute confusion causée par les mises à jour récentes.
3 Réponses :
utiliser la jointure gauche, pas besoin de sous-requête
select p.*,jr.*,jrr.* from People p left join PeopleJobRequirements jr on p.Id=jrPersonId left join JobRoleRequirements jrr p.id=jrr.PersonId
CROSS JOIN
pour obtenir un enregistrement égal pour chaque personne et LEFT JOIN
pour les enregistrements correspondants.
La requête suivante devrait fonctionner dans votre scénario
+----+----------+---------------------+ | Id | FullName | Title | +----+----------+---------------------+ | 3 | Becky | Another Requirement | +----+----------+---------------------+ | 3 | Becky | NULL | +----+----------+---------------------+ | 1 | Jimmy | Some Requirement | +----+----------+---------------------+ | 1 | Jimmy | Another Requirement | +----+----------+---------------------+ | 2 | John | NULL | +----+----------+---------------------+ | 2 | John | Some Requirement | +----+----------+---------------------+
select p.Id, p.FullName,r.Title FROM People p cross join (select distinct title from PeopleJobRequirements ) pj left join PeopleJobRequirements r on p.id=r.personid and pj.Title=r.Title order by fullname
Parfait! Merci beaucoup, une très grande aide. Puis-je vous demander quel est votre processus de réflexion lorsque vous abordez des problèmes comme celui-ci? Commencez-vous par la jointure gauche ou la jointure croisée, et pensez-vous d'abord qu'il s'agit de requêtes plus petites ou que vous commencez par l'ensemble de données final que vous visez? Merci encore.
@ JᴀʏMᴇᴇ, je préfère d'abord les petites requêtes et les construis progressivement pour l'exigence finale.
selon l'explication, les tables People et PeopleJobRequirements ont des relations plusieurs à plusieurs (n à n). donc tout d'abord vous aurez besoin d'une autre table pour les relier à la table. faites-le d'abord, puis une jointure complète le fera correctement.
Cela ressemble à un travail pour
APPLIQUER EXTERNE
.Des questions comme celle-ci sont toujours plus claires lorsque vous nous fournissez des exemples de données et le résultat attendu
@GuidoG - bon point, je vais l'ajouter maintenant ....
@PSK - excuses - je soupçonnais que je causais une certaine confusion! Je vais vérifier la réponse maintenant, merci.