Ключем до налагодження таких ситуацій є запуск підзапиту / вбудованого подання самостійно, щоб побачити, який результат:
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
Запустивши це, ви побачите, що profile_id
значення не відповідає u.id
значенню u162231993
, що пояснює, чому mbg
повертаються будь-які посилання null
(завдяки лівому об’єднанню; ви не отримаєте нічого, якби це було внутрішнє об’єднання).
Ви закодували себе в кут, використовуючи TOP
, тому що тепер вам потрібно налаштувати запит, якщо ви хочете запустити його для інших користувачів. Кращим підходом було б:
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'
Завдяки цьому ви можете змінити id
значення в where
пункті, щоб перевірити записи для будь-якого користувача в системі.