多対多の関係で2つのテーブルを結合しています。NOT INを使用するとクエリのパフォーマンスが向上する方法
最終結果では、各PolicyNumberに複数のClassCodeがあります。 は、以下のようになります。
今、私はSSRSで@ClassCodeパラメータが選びだしされている場合PaidLossesで全体PolicyNumberを除外する必要があります。 したがって、NOT IN
を使用してPolicyNumber
をなくすと、永遠に回転します。
select
cte1.PolicyNumber,
cte1.TransactionEffectiveDate,
cc.ClassCode,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY cte1.QuoteID, cte1.PolicyNumber, cc.TransactionEffectiveDate ORDER BY (SELECT 0))=1 THEN cte1.WP
ELSE 0
END as WP--,
from cte1 inner join tblClassCodesPlazaCommercial cc on cte1.PolicyNumber=cc.PolicyNumber AND cte1.QuoteID=cc.QuoteID AND cte1.TransactionEffectiveDate=cc.TransactionEffectiveDate
AND cc.PolicyNumber IN (SELECT PolicyNumber FROM tblClassCodesPlazaCommercial WHERE ClassCode NOT IN (@ClassCode))
私の場合、他の方法でクエリのパフォーマンスを改善できますか?
全体のクエリは以下の通りです:CTE3については
DECLARE @ClassCode int = 5151
;with cte1
as
(
SELECT QuoteID,
CONVERT(VARCHAR(10),TransactionEffectiveDate,101) as TransactionEffectiveDate,
PolicyNumber,
SUM(WrittenPremium) as WP
FROM PlazaInsuranceWPDataSet
WHERE State IN ('CA','NV','AZ')
GROUP BY
PolicyNumber,
QuoteID,
TransactionEffectiveDate
),
cte3
as
(
select
cte1.PolicyNumber,
cte1.TransactionEffectiveDate,
cc.ClassCode,
CASE
WHEN ROW_NUMBER() OVER (PARTITION BY cte1.QuoteID, cte1.PolicyNumber, cc.TransactionEffectiveDate ORDER BY (SELECT 0))=1 THEN cte1.WP
ELSE 0
END as WP--,
from cte1 inner join tblClassCodesPlazaCommercial cc on cte1.PolicyNumber=cc.PolicyNumber AND cte1.QuoteID=cc.QuoteID AND cte1.TransactionEffectiveDate=cc.TransactionEffectiveDate
AND cc.PolicyNumber IN (SELECT PolicyNumber FROM tblClassCodesPlazaCommercial WHERE ClassCode NOT IN (@ClassCode))
)
select
c.YearNum,
c.MonthNum,
SUM(WP) as WP
from cte3 RIGHT JOIN tblCalendar c ON c.YearNum=YEAR(TransactionEffectiveDate) AND c.MonthNum=MONTH(TransactionEffectiveDate)
WHERE c.YearNum <>2017
GROUP BY
c.YearNum,
c.MonthNum
ORDER BY c.YearNum desc,
c.MonthNum
申し訳ありませんが、あなたは、 'NOTを使用しています単一の整数値をテストするために '<>'の代わりに 'IN'を使用します:' WHERE ClassCode NOT IN(@ClassCode) '?他の 'IN'相関サブクエリに対して' EXISTS'を調べましたか?または「OUTER JOIN」? – HABO
<を試しました。それでも、永遠に取る。 – Oleg
EXISTSも試しました。それでも同じ – Oleg