Ich muss mein Ergebnis nach zwei Spalten aus der Unterabfrage filtern, damit ich sie wie folgt verbinden kann, was gut funktioniert.

select * from EDM_STATUS_REPORT_DATA LEFT JOIN 
(
   Select DocumentID, LogDate
   From [LM_StateEvents]
   Where 1=1

) table2
ON 
   EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
   AND EDM_STATUS_REPORT_DATA.StatusDate = table2.LogDate 
WHERE table2.DocumentID IS NOT NULL

Das EDM_STATUS_REPORT_DATA.StatusDate in der Hauptabfrage entspricht jedoch nicht dem Wert der Unterabfrage. Es würde einen Unterschied von maximal +5 Sekunden aufweisen. Also muss ich gerne zwischen table2.LogDate und table2.LogDate + 5 seconds suchen.

Wie kann ich das erreichen?

Unten finden Sie die Beispieldaten und die erwartete Ausgabe.

enter image description here

0
eshaa 19 Feb. 2020 im 19:09

4 Antworten

Beste Antwort

Sie können ein DATEDIFF verwenden, um sicherzustellen, dass der Unterschied 5 Sekunden nicht überschreitet:

select * from EDM_STATUS_REPORT_DATA LEFT JOIN 
(
   Select DocumentID, LogDate
   From [LM_StateEvents]
   Where 1=1

) table2
ON 
   EDM_STATUS_REPORT_DATA.LLObjID=table2.DocumentID
   AND DATEDIFF(second,EDM_STATUS_REPORT_DATA.StatusDate,table2.LogDate) between -5 and 5
WHERE table2.DocumentID IS NOT NULL
1
CR7SMS 19 Feb. 2020 im 16:23

Sie können diese Antwort hier sehen, um einem Datum Sekunden hinzuzufügen (verwenden Sie die DateADD-Funktion): https://stackoverflow.com/a/3480794/ 6601237

0
Altie 19 Feb. 2020 im 16:15

Ich denke du willst cross apply:

select srd.*, le.*
from EDM_STATUS_REPORT_DATA src cross apply
     (Select DocumentID, LogDate
      From LM_StateEvents le
      where le.LLObjID = srd.DocumentID and
            le.LogDate  = src.StatusDate 
     ) le
where le.DocumentID is not null;

Hinweis: Ihre äußere where -Klausel weist darauf hin, dass Sie eine Übereinstimmung benötigen. Ich frage mich, warum Sie in diesem Fall eine äußere Verknüpfung verwenden.

0
Gordon Linoff 19 Feb. 2020 im 21:51

Sie können dies erheblich vereinfachen, indem Sie sich der Tabelle anschließen, anstatt eine Unterabfrage zu erstellen und sich dieser anzuschließen. Außerdem sollten Sie einen inneren Join anstelle eines linken Joins verwenden, da Ihr Where-Prädikat ihn in einen inneren Join ändert. Ich kann die Verwendung solcher Funktionen in Ihren Join-Prädikaten nicht gutheißen, da sie nicht SARGable sind. Sie sollten das Design wahrscheinlich korrigieren, damit Sie dies nicht tun müssen. Aber angesichts der aktuellen Tabellen, wie Sie sie haben, können Sie so etwas tun.

select * 
from EDM_STATUS_REPORT_DATA  rd
JOIN LM_StateEvents se on rd.LLObjID = se.DocumentID
   AND abs(datediff(second, rd.StatusDate = se.LogDate)) <= 5
1
Sean Lange 19 Feb. 2020 im 16:37