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:
SELECT TOP 1
dm.marker_value,
dum.profile_id
FROM DPS_USR_MARKERS dum (NOLOCK)
JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id
AND dm.marker_key = 'moneyBackGuaranteeLength'
ORDER BY dm.creation_date
En exécutant cela, vous verriez que la profile_id
valeur ne correspond pas à la u.id
valeur de u162231993
, ce qui expliquerait pourquoi des mbg
références reviendraient null
(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:
SELECT u.id,
x.marker_value
FROM DPS_USER u
LEFT JOIN (SELECT dum.profile_id,
dm.marker_value,
dm.creation_date
FROM DPS_USR_MARKERS dum (NOLOCK)
JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id
AND dm.marker_key = 'moneyBackGuaranteeLength'
) x ON x.profile_id = u.id
JOIN (SELECT dum.profile_id,
MAX(dm.creation_date) 'max_create_date'
FROM DPS_USR_MARKERS dum (NOLOCK)
JOIN DPS_MARKERS dm (NOLOCK) ON dm.marker_id= dum.marker_id
AND dm.marker_key = 'moneyBackGuaranteeLength'
GROUP BY dum.profile_id) y ON y.profile_id = x.profile_id
AND y.max_create_date = x.creation_date
WHERE u.id = 'u162231993'
Avec cela, vous pouvez changer le id
valeur de la where
clause pour vérifier les enregistrements de n'importe quel utilisateur du système.