Compte tenu de la requête ci-dessous, il peut y avoir plusieurs lignes dans dps_markers avec la même clé de marqueur, mais nous ne voulons joindre que la première. Si je prends cette requête et supprime le top 1 et ORDER BY, j'obtiens une valeur pour mbg.marker_value mais l'exécute tel quel, il retourne toujours null
SELECT u.id, mbg.marker_value
FROM dps_user u
LEFT JOIN
(SELECT TOP 1 m.marker_value, um.profile_id
FROM dps_usr_markers um (NOLOCK)
INNER JOIN dps_markers m (NOLOCK)
ON m.marker_id= um.marker_id AND
m.marker_key = 'moneyBackGuaranteeLength'
ORDER BY m.creation_date
) MBG ON MBG.profile_id=u.id
WHERE u.id = 'u162231993'
sql-server
outer-join
dstarh
la source
la source
La clé pour déboguer des situations comme celles-ci est d'exécuter la sous-requête / vue en ligne seule pour voir quelle est la sortie:
En exécutant cela, vous verriez que la
profile_id
valeur ne correspond pas à lau.id
valeur deu162231993
, ce qui expliquerait pourquoi desmbg
références reviendraientnull
(grâce à la jointure de gauche; vous n'obtiendrez rien s'il s'agissait d'une jointure interne).Vous vous êtes codé dans un coin en utilisant
TOP
, car vous devez maintenant modifier la requête si vous souhaitez l'exécuter pour d'autres utilisateurs. Une meilleure approche serait:Avec cela, vous pouvez changer le
id
valeur de lawhere
clause pour vérifier les enregistrements de n'importe quel utilisateur du système.la source
Parce que la
TOP 1
sous-requête ordonnée n'a pasprofile_id = 'u162231993'
Supprimerwhere u.id = 'u162231993'
et voir les résultats alors.Exécutez la sous-requête séparément pour comprendre ce qui se passe.
la source
Damir a raison,
Votre sous-requête doit s'assurer que dps_user.id est égal à um.profile_id, sinon il récupérera la ligne du haut qui pourrait, mais probablement pas égaler votre id de 'u162231993'
Votre requête doit ressembler à ceci:
la source
WHERE um.profile_id = 'u162231993'
dans la sous-requête etWHERE mbg.marker_value IS NOT NULL
à l'extérieur.@SearchFor = 'u162231993'
, puis utilisez-la dansWHERE
, ou publiez des données et des structures de tableau afin que d'autres personnes puissent vous aider et l'essayer.