SQL

2010-01-13 4 views
1

관련 테이블 "그룹에 의해 상위 1"에 도움이 PhoneID INT, PHONETYPE INT

은 = 4 PHONETYPE 6 개 전화가 있다는 것을 DepartmentID = 2에 속합니다. DepartmentID = 2가 설명을 위해 내 쿼리 모든 부서를 가져올 것입니다
SQL

select * 
from DepartmentPhone 
    join Phone on Phone.PhoneID = DepartmentPhone.PhoneID and Phone.PhoneType = 4 
where DepartmentPhone.DepartmentID = 2 

참고 : 그래서이 6 개 기록을 생산하고 있습니다.
내가 원하는 것은 각 부서에 대해 첫 번째 전화 (유형 = 4)를 선택하는 것입니다. 부서 당 단 하나의 행만 선택하십시오. 나는 다음 쿼리가 트릭을 할 것이라고 생각했지만 6 개의 레코드를 모두 검색했다. 나는 무엇을 놓치고 있습니까?

select x.* 
from DepartmentPhone x 
where 
    x.DepartmentID = 2 
    and x.PhoneID = (select max(y.PhoneID) 
        from departmentphone y 
        join Phone on y.PhoneID = Phone.PhoneID and Phone.PhoneType = 4 
        where x.DepartmentPhoneID = y.DepartmentPhoneID) 

당신의 도움을 주셔서 감사합니다!

답변

0

스키마는 물론 잘 모르지만 그룹화를 DepartmentID (아니 DepartmentPhoneID)과 연결해야한다고 생각합니다.

select x.* 
from DepartmentPhone x 
where 
    x.DepartmentID = 2 
    and x.PhoneID = (select max(y.PhoneID) 
        from departmentphone y 
        join Phone on y.PhoneID = Phone.PhoneID and Phone.PhoneType = 4 
        where x.DepartmentID = y.DepartmentID); 

다음은 상관 하위 쿼리를 사용하지 않고 동일한 결과를 얻는 몇 가지 대체 쿼리입니다.

select * 
from DepartmentPhone x 
join (select d.DepartmentID, max(d.PhoneID) as maxPhoneID 
     from DpartmentPhone d join Phone p using (PhoneID) 
     where p.PhoneType = 4 
     group by d.DepartmentID) y 
    using (DepartmentID); 

두 번째 대안은 전혀 하위 쿼리를 사용하지 않지만 자기가 조인 : 첫 번째는 파생 테이블을 사용

select d1.* 
from DepartmentPhone d1 
join Phone p1 on d1.PhoneID = p1.PhoneID and p1.PhoneType = 4 
left outer join (DepartmentPhone d2 join Phone p2 
    on d2.PhoneID = p2.PhoneID and p2.PhoneType = 4) 
    on d1.DepartmentID = d2.DepartmentID and d1.PhoneID < d2.PhoneID 
where d2.DepartmentID is NULL; 
2

내가 이에 대한 깨끗한 구문이 있었다 바랍니다. 최고는 사용하는 것입니다 ROW_NUMBER :

;WITH DepartmentPhone_CTE AS 
(
    SELECT p.*, 
     ROW_NUMBER() OVER 
      (PARTITION BY dp.DepartmentID ORDER BY dp.PhoneID) AS RowNum 
    FROM DepartmentPhone dp 
    INNER JOIN Phone p 
     ON p.PhoneID = dp.PhoneID 
    WHERE p.PhoneType = 4 
) 
SELECT dp.* 
FROM DepartmentPhone_CTE 
WHERE RowNum = 1 
+0

답장을 보내 주셔서 감사합니다. 그것이 올바른 것이지만 Bill은 내 실수가 어디에 있는지를 보여주었습니다 (DepartmentID가 아니라 DepartmentPhoneID와 상관 관계가 있음). 도와 주셔서 감사합니다. –