2010-01-13 17 views
1

相关表格:
DepartmentPhone:DepartmentPhoneID INT,DepartmentID的INT,PhoneID INT
电话:PhoneID INT,PHONETYPE INT

有6个手机PHONETYPE = 4中属于DepartmentID = 2。所以这将产生6条:
SQL - 帮助的 “顶部1按组”

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

注意DepartmentID的= 2是用于说明目的,我的查询将带来的所有部门。
我想实现的是为每个部门选择第一个电话(类型= 4) - 每个部门只有1行。我认为下面的查询会执行这个技巧,但它会一直检索所有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

谢谢你的回答。虽然这是正确的比尔告诉我我的错误在哪里(关联DepartmentIDID而不是DepartmentID)。我感谢您的帮助。 – 2010-01-13 16:28:11