กุญแจสำคัญในการดีบักสถานการณ์เช่นนี้คือการรัน subquery / inline view ด้วยตัวของมันเองเพื่อดูว่าผลลัพธ์คืออะไร:
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
ประโยคเพื่อตรวจสอบเร็กคอร์ดสำหรับผู้ใช้ใด ๆ ในระบบ