Der Schlüssel zum Debuggen solcher Situationen besteht darin, die Unterabfrage / Inline-Ansicht selbst auszuführen, um zu sehen, wie die Ausgabe lautet:
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
Wenn Sie dies ausführen, werden Sie feststellen, dass der profile_id
Wert nicht mit dem u.id
Wert von übereinstimmt. Dies u162231993
würde erklären, warum mbg
Referenzen zurückgegeben werden null
(dank des linken Joins; Sie würden nichts erhalten, wenn es sich um einen inneren Join handelt).
Sie haben sich mit in eine Ecke codiert TOP
, da Sie jetzt die Abfrage optimieren müssen, wenn Sie sie für andere Benutzer ausführen möchten. Ein besserer Ansatz wäre:
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'
Damit können Sie den id
Wert in der where
Klausel ändern , um Datensätze für jeden Benutzer im System zu überprüfen.