2013-02-07 2 views
1

가입 전화 번호는 서비스 유형에 따라 침대 또는 좌석을 나타내는 ServiceType.serviceTypeId와 관련된 경우에만 의미가 있습니다.SQL 자기 나는 네 개의 테이블이 쿼리

내가 작성 및 저장 프로 시저에서 임시 테이블을 폐기하는 것은있을 수 가난한 해결책이 거의 확실 해요 facilitatorName, 침대, 좌석 :

은 내가 nammely 3 열을 반환 할 쿼리를 작성해야 미래의 확장성에 대한 부정적인 파급 효과 등이 있으며 솔루션에는 Service 테이블에 대한 자체 조인이 포함됩니다.

지금까지 내 쿼리는 다음과 같이 읽지 만 행을 반환하지 않습니다. 나는 무엇을 놓치고 있습니까?

SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds,(SUM(ts2.capacity)) as Seats 

FROM dbo.Facilitator as f, 
     dbo.TestService as ts1, 
     dbo.TestService as ts2, 
     dbo.ServiceFacilitator as sf 

WHERE f.facilitatorId = sf.facilitatorId AND 
     (sf.serviceId = ts1.serviceId or 
     sf.serviceId = ts2.serviceId) and 
     ts1.serviceId = ts2.serviceId and 
     ts1.serviceTypeId = '1' and -- type hotel 
     ts2.serviceTypeId = '2' -- type conference centre   

GROUP BY f.facilitatorName 

과 같은 두 가지로 쿼리를 깨는 것은 정확한 침대에 대한 결과 및 좌석 반환합니다

SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds 

FROM dbo.Facilitator as f, 
     dbo.TestService as ts1, 
     dbo.ServiceFacilitator as sf 

WHERE f.facilitatorId = sf.facilitatorId AND 
     sf.serviceId = ts1.serviceId and 
     ts1.serviceTypeId = '1'   

GROUP BY f.facilitatorName 

SELECT f.facilitatorName,(SUM(ts2.capacity)) as Seats 

FROM dbo.Facilitator as f, 
     dbo.TestService as ts2, 
     dbo.ServiceFacilitator as sf 

WHERE f.facilitatorId = sf.facilitatorId AND 
     sf.serviceId = ts2.serviceId and 
     ts2.serviceTypeId = '2'   

GROUP BY f.facilitatorName 

감사합니다 ..

+1

[나란히 (http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins .aspx)는 아마 읽을만한 가치가 있습니다. 사용중인 JOIN 구문 (ANSI 89)은 20 년이 넘었으며 ANSI 92에서 명시 적 조인으로 바뀌 었습니다. – GarethD

+0

링크 엔터티 'ServiceFacilitator'는 각 서비스가 여러 Facilitator를 가질 수 있음을 의미합니다. 서비스에 여러 Facilitator가있는 경우 용량 분할이 필요합니까? –

+0

@ 마크 ... 정말 잘 모름; 이 마지막 순간에 막 들어 왔어. 아직 모든 일에 노출되어 있어야합니다 ... 시간을내어 주셔서 감사합니다 ... –

답변

3

를 쿼리에 대한 간단한 해결책은 다음과 같아야합니다

SELECT f.facilitatorName, 
     SUM(case when ts.serviceTypeId = '1' then ts.capacity end) as Beds, 
     SUM(case when ts.serviceTypeId = '2' then ts.capacity end) as Seats 
FROM dbo.Facilitator as f 
LEFT JOIN dbo.ServiceFacilitator as sf ON f.facilitatorId = sf.facilitatorId 
LEFT JOIN dbo.TestService as ts ON sf.serviceId = ts.serviceId 
GROUP BY f.facilitatorName 
+0

Spot-on; 많은 감사합니다 .. –

0

이 쿼리에는 Join을 사용해야합니다. 예 :

SELECT f.facilitatorName,(SUM(ts1.capacity)) as Beds,(SUM(ts2.capacity)) as Seats 

FROM 
     dbo.ServiceFacilitator as sf 
join dbo.Facilitator as f 
on sf.facilitatorI = f.facilitatorId 
join dbo.TestService as ts1 
on sf.serviceId = ts1.serviceId 
join dbo.TestService as ts1 
on sf.serviceId = ts2.serviceId 

WHERE 
     ts1.serviceTypeId = '1' and -- type hotel 
     ts2.serviceTypeId = '2' -- type conference centre   

GROUP BY f.facilitatorName 
관련 문제