0

異なるテーブルをクエリし、同様のフィールドを返す 2 つの 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
4

3 に答える 3

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
于 2013-01-24T19:20:59.257 に答える
-2

内部結合に使用しているクエリを投稿できますか?通常、結合列に有用なインデックスがある場合、クエリは適切に実行されます。

そうでない場合は、2つの一時テーブルを作成することをお勧めします。1つは各クエリの結果を格納します。次に、結合列の一時テーブルにインデックスを作成します。一時テーブルを使用して、最終的なクエリを実行します。

于 2013-01-24T19:12:51.717 に答える