In Anbetracht der folgenden Abfrage gibt es möglicherweise mehrere Zeilen in dps_markers mit demselben Markierungsschlüssel, aber wir möchten nur gegen die erste beitreten. Wenn ich diese Abfrage nehme und die Top 1 und ORDER BY entferne, erhalte ich einen Wert für mbg.marker_value, aber laufe so wie er ist, gibt er immer null zurück
SELECT u.id, mbg.marker_value
FROM dps_user u
LEFT JOIN
(SELECT TOP 1 m.marker_value, um.profile_id
FROM dps_usr_markers um (NOLOCK)
INNER JOIN dps_markers m (NOLOCK)
ON m.marker_id= um.marker_id AND
m.marker_key = 'moneyBackGuaranteeLength'
ORDER BY m.creation_date
) MBG ON MBG.profile_id=u.id
WHERE u.id = 'u162231993'
sql-server
outer-join
dstarh
quelle
quelle
Der Schlüssel zum Debuggen solcher Situationen besteht darin, die Unterabfrage / Inline-Ansicht selbst auszuführen, um zu sehen, wie die Ausgabe lautet:
Wenn Sie dies ausführen, werden Sie feststellen, dass der
profile_id
Wert nicht mit demu.id
Wert von übereinstimmt. Diesu162231993
würde erklären, warummbg
Referenzen zurückgegeben werdennull
(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:Damit können Sie den
id
Wert in derwhere
Klausel ändern , um Datensätze für jeden Benutzer im System zu überprüfen.quelle
Weil die
TOP 1
aus der bestellten Unterabfrage nichtprofile_id = 'u162231993'
entfernenwhere u.id = 'u162231993'
und dann Ergebnisse sehen.Führen Sie die Unterabfrage separat aus, um zu verstehen, was los ist.
quelle
Damir ist richtig,
Ihre Unterabfrage muss sicherstellen, dass dps_user.id gleich um.profile_id ist. Andernfalls wird die oberste Zeile erfasst, die möglicherweise, aber wahrscheinlich nicht Ihrer ID von 'u162231993' entspricht.
Ihre Anfrage sollte folgendermaßen aussehen:
quelle
WHERE um.profile_id = 'u162231993'
in die Unterabfrage undWHERE mbg.marker_value IS NOT NULL
nach außen setzen.@SearchFor = 'u162231993'
und verwenden Sie sie dann inWHERE
oder veröffentlichen Sie einige Daten- und Tabellenstrukturen, damit andere Personen helfen und sie ausprobieren können.