2013-01-24 68 views
0

我有查詢不同的表,並返回類似領域的兩個SQL查詢:SQL - 加入兩個查詢高效地協同

User - Role - Category - Points 

User - Role - Category - Target 

我的查詢是這樣的:

select 
    acs.UserID, 
    acs.RoleID, 
    acs.CategoryID, 
    sum(acs.Points) 
from acs 

select 
    tb.UserID, 
    tb.RoleID, 
    tb.CategoryID, 
    sum(
     (
      (DATEDIFF(dd, (case when @start >= tb.StartDate then @start else tb.StartDate end), (case when @end <= tb.EndDate then @end else tb.EndDate end)) + 1) 
     ) * tb.dailyMed 
    ) as Target 
from tb 

我想什麼直到結束是這樣的:

User - Role - Category - Points - Target 

每個單獨的查詢需要不到1秒的運行,但是當我嘗試使用內把它們結合起來加入吧接管跑3分鐘。

我希望有這樣做的更有效的方式,但我似乎無法找到一個。

*編輯 我內在的加入看起來像這樣

select 
    acs.UserID, 
    acs.RoleID, 
    acs.CategoryID, 
    sum(acs.Points), 
    t.Target 
from 
    dbo.ActualCacheSale acs 
     inner join 
      (select 
       tb.UserID, 
       tb.RoleID, 
       tb.CategoryID, 
       sum(
        (
         (DATEDIFF(dd, (case when @start >= tb.StartDate then @start else tb.StartDate end), (case when @end <= tb.EndDate then @end else tb.EndDate end)) + 1) 
        ) * tb.dailyMed 
       ) as Target 
      from 
       dbo.TargetBucket tb 
      ) t on 
       t.UserID = acs.UserID and 
       t.RoleID = acs.RoleID and 
       t.CategoryID = acs.CategoryID 
+3

告訴我們您的內部聯接查詢 –

+0

你能告訴你的INNER JOIN語句? – Guido

+0

添加了內部連接 – Rick

回答

6

嘗試

select 
aa.UserId, 
aa.Roleid, 
aa.CategoryId 
Sum(aa.Points) as Points, 
Sum(aa.Target) as Target 
from 
(
select 
    acs.UserID, 
    acs.RoleID, 
    acs.CategoryID, 
    sum(acs.Points) as Points 
    null as target 
from acs 

union all 

select 
    tb.UserID, 
    tb.RoleID, 
    tb.CategoryID, 
    0 as points 
    sum(
     (
     (DATEDIFF(dd, (case when @start >= tb.StartDate then @start else tb.StartDatee end),  
    (case when @end <= tb.EndDate then @end else tb.EndDate end)) + 1) 
    ) * tb.dailyMed 
    ) as Target 
from tb) as aa 
group by 
aa.UserId, 
aa.Roleid, 
aa.CategoryId 
+0

這很棒。 – Rick

+0

工會+小組是一個小技巧,多年來一直很適合我。當然,在特定情況下。我建議你這樣做,因爲你說每個人的查詢都很快。 – automatic

+0

我現在已經加入到多個表的聯合查詢,它仍然是一個3秒的查詢。再次感謝 – Rick

-2

你可以發佈你正在使用內部聯接查詢?通常,如果連接列上有有用的索引,則查詢應該執行得很好。

如果不是一個很好的選擇是創建兩個臨時表,1存儲每個查詢的結果。然後在連接列上的臨時表上創建索引。使用臨時表運行最終查詢。

+1

-1這真的只是猜測。第一部分應該是一個評論。 – Jacco

+0

@Jacco這不是真的猜測,創建或使用索引可能是這裏的正確答案。我同意第一部分應該是一個評論。 SQLSuperGuru,你能不能格式化你的答案好一點,並將你的問題轉移到評論? – Luke

+1

數據庫被正確編入索引,我最初的解決方案是利用臨時表,但是這個解決方案比現在慢得多。 – Rick

0

也許我失去了一些東西,但我不知道你是如何得到一筆不進行分組成一個聚合。不管怎麼說,這是我拿 - 希望我沒有錯過任何東西:

SELECT P.UserID , 
     P.RoleID , 
     P.CategoryID , 
     P.Points , 
     T.Target 
FROM (SELECT acs.UserID , 
        acs.RoleID , 
        acs.CategoryID , 
        SUM(acs.Points) Points 
      FROM  acs 
      GROUP BY acs.UserID , 
        acs.RoleID , 
        acs.CategoryID 
     ) P 
     CROSS APPLY (SELECT tb.UserID , 
           tb.RoleID , 
           tb.CategoryID , 
           SUM(((DATEDIFF(dd, (CASE WHEN @start >= tb.StartDate THEN @start 
                  ELSE tb.StartDate 
                 END), (CASE WHEN @end <= tb.EndDate THEN @end 
                    ELSE tb.EndDate 
                   END)) + 1)) * tb.dailyMed) AS Target 
         FROM  TB 
         WHERE  TB.UserID = P.UserID 
           AND TB.RoleID = P.RoleID 
           AND TB.CategoryID = P.CategoryID 
         GROUP BY tb.UserID , 
           tb.RoleID , 
           tb.CategoryID 
        ) T 
+0

對不起,我在我的查詢中有group by子句。我會放棄這一點。謝謝 – Rick

+0

這可行,但它仍然需要兩分鐘才能完成。謝謝你的幫助。 – Rick

+0

如果你看看執行計劃,它是否建議任何額外的索引? –