2010-01-13 70 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