Chìa khóa để gỡ lỗi các tình huống như thế này là tự chạy truy vấn con / chế độ xem nội tuyến để xem đầu ra là gì:
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
Chạy điều đó, bạn sẽ thấy rằng profile_id
giá trị không khớp với u.id
giá trị của u162231993
, điều này sẽ giải thích lý do tại sao bất kỳ mbg
tham chiếu nào sẽ trả về null
(nhờ phép nối bên trái; bạn sẽ không nhận được gì nếu đó là phép nối bên trong).
Bạn đã tự mã hóa mình vào một góc bằng cách sử dụng TOP
, bởi vì bây giờ bạn phải điều chỉnh truy vấn nếu bạn muốn chạy nó cho người dùng khác. Một cách tiếp cận tốt hơn sẽ là:
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'
Cùng với đó, bạn có thể thay đổi id
giá trị trong where
mệnh đề để kiểm tra bản ghi cho bất kỳ người dùng nào trong hệ thống.