2016-10-19 9 views
0

DBMS는 입니다! 이처럼 복잡한 LEFT JOIN이 예상대로 작동하지 않습니다.

VXU_V04 0 (null) ADT_A03 3 0.01 ADT_A04 3 0.01 ADT_A08 143 0.01 
이 0 레코드가 하나 개의 결과가 있음을 감안할 때, 그것은 보인다

:

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 

이 나에게 사 개 결과를 제공합니다 : 여기

내 전체 쿼리입니다 일. 내가 SELECT DISTINCT(name) FROM ENSLIB_HL7.Message를 실행하는 경우 그러나, 나는 얻을 10 개 개의 결과 :

VXU_V04 
ADT_A08 
ACK_A08 
ADT_A03 
ACK_A03 
ADT_A04 
ACK_A04 
ACK_V04 
ADT_A01 
ACK_A01 

가 왜 내 전체 쿼리 열 개 행을 얻을하지 않습니다?

답변

1

변경 GROUP BY에 :

GROUP BY m.Name 

만 모든 NULL 값을 하나 개의 행을 얻을 수 있도록 당신의 테이블의 열을 기준으로 집계됩니다.

대부분의 데이터베이스는이 구문을 거부하지만 Intersystems Cache는이를 허용합니다.

+0

: facepalm : 감사합니다. –

+0

"이지만 Intersystems Cache는이를 허용합니다." ¯ \ _ (ツ) _/¯ –