2016-10-19 1 views
0

DBMS ist !Complex LEFT JOIN funktioniert nicht wie erwartet

Hier ist meine volle Abfrage:

SELECT m.Name AS MessageType, COUNT(l.name) AS MessageCount, CAST(AVG(ResponseTime) AS DECIMAL(5, 2)) AS AvgResponseTime 
FROM 
     (SELECT DISTINCT(name) FROM ENSLIB_HL7.Message) m LEFT JOIN 
     (
     SELECT CAST(li.SessionId AS Bigint) AS session_id, li.name, MIN(li.TimeCreated) AS SessionStart, MAX(lo.TimeCreated) AS SessionEnd, CAST(DATEDIFF(s, MIN(li.TimeCreated), MAX(lo.TimeCreated)) AS DECIMAL(5, 2)) AS ResponseTime 
     FROM (SELECT h1.SessionId, h1.TimeCreated, $PIECE(RawContent, '|', 4), m1.name FROM ens.messageheader h1, ENSLIB_HL7.Message m1 WHERE h1.MessageBodyId = m1.id AND h1.TimeCreated > DATEADD(mi, -30, GETUTCDATE())) li 
     JOIN (SELECT h2.SessionId, h2.TimeCreated FROM ens.messageheader h2, ENSLIB_HL7.Message m2 WHERE h2.MessageBodyId = m2.id AND h2.TimeCreated > DATEADD(mi, -30, GETUTCDATE())) lo 
     ON li.SessionId = lo.SessionId 
     GROUP BY li.SessionId 
     ) l on m.name = l.name 
GROUP BY l.Name 

Das gibt mir 4 Ergebnisse:

VXU_V04 0 (null) 
ADT_A03 3 0.01 
ADT_A04 3 0.01 
ADT_A08 143 0.01 

Da es ein Ergebnis mit 0 Datensätze ist, scheint es, wie es ist Arbeiten. Allerdings, wenn ich SELECT DISTINCT(name) FROM ENSLIB_HL7.Message laufen bekomme ich 10 Ergebnisse:

VXU_V04 
ADT_A08 
ACK_A08 
ADT_A03 
ACK_A03 
ADT_A04 
ACK_A04 
ACK_V04 
ADT_A01 
ACK_A01 

Warum ich zehn Reihen nicht mit meiner vollen Abfrage bekommen?

Antwort

1

Ändern der GROUP BY zu:

GROUP BY m.Name 

Sie sind in der Sekunden Tabelle durch die Spalte aggregieren, so dass Sie nur eine Zeile für alle NULL Werte erhalten.

Die meisten Datenbanken würden diese Syntax ablehnen, aber anscheinend ermöglicht Intersystems Cache es.

+0

: facepalm: Danke! –

+0

"aber offenbar ermöglicht Intersystems Cache es." ¯ \ _ (ツ) _/¯ –