2009-08-19 20 views
1

我經常發現自己做大意如下的東西在SQL Server 2005:要求在SQL Server中加入與集團其他兩個請求的結果BY子句2005

第一步:

create view view1 as 
select count(*) as delivery_count, clientid from deliveries group by clientid; 

第二步:

create view view2 as 
select count(*) as action_count, clientid from routeactions group by clientid; 

第三步:

select * from view1 inner join view2 on view1.clientid = view2.clientid 

是否有可能只在一個語句中獲得相同的最終結果,從而避免創建視圖?

+0

在派生表上閱讀以下內容:http://www.sqlteam.com/article/using-derived-tables-to-calculate-aggregate-values和http://www.mssqltips.com/tip.asp?tip=1042 – 2009-08-19 18:50:42

回答

4

當然,使用嵌套查詢:

select * 
from (select count(*) as delivery_count, clientid 
     from deliveries group by clientid) AS view1 
inner join (select count(*) as action_count, clientid 
      from routeactions group by clientid) AS view2 
    on view1.clientid = view2.clientid 

或新型CTE語法,你可以有:

WITH view1 AS (
    select count(*) as delivery_count, clientid from deliveries group by clientid 
), view2 AS (
    select count(*) as action_count, clientid from routeactions group by clientid 
) 
select * from view1 inner join view2 on view1.clientid = view2.clientid 
0

我想不出有什麼辦法可以解決我的問題,除非在路線和交付之間存在某種你沒有提到的關係。如果沒有(一個FK從一個到另一個,很可能),你不能做一個連接而不會扭曲一個或兩個表上的數字。

0
SELECT 
    clientid, 
    (SELECT COUNT(*) FROM deliveries where clientid = clientIds.clientid) AS 'delivery_count', 
    (SELECT COUNT(*) FROM routeactions WHERE clientid = clientIds.clientid) 
AS 'action_count' 
FROM 
(
SELECT clientid FROM deliveries 
UNION 
SELECT clientid FROM routeactions 
) clientIds 

我認爲應該工作,有更容易的解決方案,如果你有一個客戶表

+2

不那麼喜歡這種方法,因爲您可以獲得隱藏的遊標(aka rbar),因爲它沒有使用基於集合的select for delivery_count或action_count 。 – 2009-08-19 16:17:42