2
votes

Requête SQL simple pour ramener null si aucune correspondance n'est trouvée

EDIT

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.


4 commentaires

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.


3 Réponses :


1
votes

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


0 commentaires

1
votes

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    |
+----+----------+---------------------+

Démonstration en ligne

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


2 commentaires

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.



0
votes

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.


0 commentaires