2012-08-13 7 views
1

SELECT 문의 각 행에 대해 LEFT JOIN의 첫 번째 결과를 얻으려고합니다.LEFT JOIN의 첫 번째 결과 만 가져 오기

이제 당장 조인 된 테이블에 100 개의 행이 있으면 SELECT에서 같은 행을 100 번 얻을 수 있습니다. 첫 번째 행을 조인하면됩니다. 그러면 중복되지 않습니다.

테이블에서 하나 이상의 행을 가져와야하므로 GROUP BY을 사용할 수 없습니다.

여기 내 쿼리의 기본 버전입니다 :

SELECT bg.PatientID, DATEDIFF(hour, bg.CreateDate, GETDATE()) TimeToTarget 
FROM BloodGlucose bg 
    LEFT JOIN IVProtocol i ON i.PatientID = bg.PatientID 
WHERE bg.BGValue >= i.TargetLow AND bg.BGValue <= i.TargetHigh 
ORDER BY bg.PatientID ASC 

내가 DISTINCT를 사용하여 시도했지만 bg.CreateDate의 데이터가 항상 동일하지 않기 때문에 그것은 중복을 반환합니다.

왼쪽에 조인 된 테이블의 첫 번째 행만 있으면됩니다.

아이디어가 있습니까?

감사합니다.

+0

당신은 당신이 "'FIRST'"를 정의하는 방법을 설명 할 수 있습니까? –

+0

'LEFT JOIN'에서 가져온 첫 번째 결과가 필요합니다. 하지만 당신에게 그렇게 말하면, 조인에 대한 순서가 없기 때문에 하위 쿼리가 필요할 것입니다. – TomShreds

+0

그래, 아직도 "첫 번째 결과"가 무슨 뜻인지 모르겠다. –

답변

2
SELECT bg.PatientID, DATEDIFF(hour, bg.CreateDate, GETDATE()) TimeToTarget 
FROM BloodGlucose bg 
cross apply (
select top 1 * 
from IVProtocol i 
where i.PatientID = bg.PatientID 
order by SOME_CRITERA 
) i 
WHERE bg.BGValue >= i.TargetLow AND bg.BGValue <= i.TargetHigh 
ORDER BY bg.PatientID ASC 

크로스 적용은 이러한 상황에 적합한 도구입니다. 그것은 조인과 같이 작동하지만 하위 쿼리 내에서 변수를 사용할 수 있습니다. 다른 결과

4
;WITH x AS 
(
    SELECT 
    bg.PatientID, 
    TimeToTarget = DATEDIFF(hour, bg.CreateDate, GETDATE()), 
    rn = ROW_NUMBER() OVER (PARTITION BY bg.PatientID ORDER BY bg.CreatedDate DESC) 
    FROM dbo.BloodGlucose AS bg 
    LEFT JOIN dbo.IVProtocol AS i 
    ON i.PatientID = bg.PatientID 
    WHERE bg.BGValue >= i.TargetLow 
    AND bg.BGValue <= i.TargetHigh 
) 
SELECT PatientID, TimeToTarget 
FROM x 
WHERE rn = 1 
ORDER BY PatientID; 

에 가입하려면 는 :

;WITH x AS 
(
    ... same as above ... 
) 
SELECT x.PatientID, x.TimeToTarget, y.Something 
FROM x INNER JOIN dbo.SomethingElse AS y 
ON x.PatientID = y.PatientID 
WHERE x.rn = 1 
ORDER BY x.PatientID; 
+0

그것은 굉장히 효과가 있습니다. 내가 가지고있는 유일한 문제는 다른 쿼리의 JOIN 문에이 쿼리를 넣어야 만하고 지금은 WITH과 그렇게하는 데 문제가있는 것 같습니다. 하지만 여전히이 작품, 나는 그것을 맞게하려고합니다. 고마워요! – TomShreds

+0

CTE 뒤에'x'에 참여할 수 있습니다. –

관련 문제