0

一時テーブルにデータを選択し、そのテーブルをクエリしてレポートの他の値を取得しています。エラーを生成するコードは次のとおりです。違いがある場合、一時テーブルには約 3600 万のレコードがあります。エラーは最初のクエリの最初の列にあると言われています。

SELECT SUBSCRIPTION_ALIAS,
       'Count' = 0,
       COUNT(SUBSCRIPTION_ALIAS) AS MonthChange
FROM #Temp1 A WHERE DATEDIFF(day,JOIN_DTM,'01/01/2012') < 31    
GROUP BY SUBSCRIPTION_ALIAS

UNION

SELECT B.SUBSCRIPTION_ALIAS,
       COUNT(B.SBSCRPTN_MBR_KEY) AS [Count],
       'MonthChange' = 0
FROM #Temp1 B JOIN #Temp1 A ON B.SUBSCRIPTION_ALIAS = A.SUBSCRIPTION_ALIAS
GROUP BY B.SUBSCRIPTION_ALIAS

DROP TABLE #Temp1

一時テーブルのステートメントは次のとおりです (見苦しいです)。エラー メッセージは、このスレッドのタイトルです。

SELECT
  bi_communications.F_EML_RCPNT.SBSCRPTN_LIST_KEY,
  bi_communications.F_EML_RCPNT.SBSCRPTN_MBR_KEY,
  bi_communications.D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM,
  bi_communications.F_EML_RCPNT.DLRY_DT_KEY,
  bi_communications.D_DT.DT_DT,

  CASE
WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM = 'active-offers' THEN 'Special Offers'
WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM = 'reserveamerica-offers' THEN 'RA Special Offers'
WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM in
   ('active-team-sports-insider','active-tennis','active-women-news', ... (omitting excess)
   ) THEN 'Content'
    WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM = 'local-events' THEN 'Local Events'
    ELSE 'Blank'
  END AS SUBSCRIPTION_ALIAS,
  bi_communications.D_SBSCRPTN_MBR.JOIN_DTM
INTO #Temp1     
FROM bi_communications.F_EML_RCPNT
    JOIN
     bi_communications.D_SBSCRPTN_LIST ON bi_communications.F_EML_RCPNT.SBSCRPTN_LIST_KEY = bi_communications.D_SBSCRPTN_LIST.SBSCRPTN_LIST_KEY
JOIN bi_communications.D_DT ON bi_communications.F_EML_RCPNT.DLRY_DT_KEY = bi_communications.D_DT.DT_KEY
    JOIN bi_communications.D_SBSCRPTN_MBR ON bi_communications.F_EML_RCPNT.SBSCRPTN_MBR_KEY = bi_communications.D_SBSCRPTN_MBR.SBSCRPTN_MBR_KEY
WHERE
  bi_communications.F_EML_RCPNT.SBSCRPTN_LIST_KEY  IN 
  ( 180740437, 180741017, 180740482, 180740438, ... )
AND bi_communications.D_DT.DT_DT BETWEEN  '01/01/2011 00:00:00' AND '01/01/2012 00:00:00'
4

2 に答える 2

1

うーん、サブスクリプション エイリアスは、3,400 万行のテーブルで 5 つほど異なる値を取ります。そのうちの 1 つには、少なくとも 600 万行が含まれます。自己結合は、これで少なくとも 36 兆行を生成するため、2 番目のクエリで算術オーバーフローがすぐに発生します。

本当にそうですか?

SELECT B.SUBSCRIPTION_ALIAS, COUNT(B.SBSCRPTN_MBR_KEY) AS [Count],'MonthChange' = 0
FROM #Temp1 B JOIN #Temp1 A
     ON B.SUBSCRIPTION_ALIAS = A.SUBSCRIPTION_ALIAS
GROUP BY B.SUBSCRIPTION_ALIAS

これは基本的に、カウントの行数を 2 乗しています。エラーは 2 番目のサブクエリにあると思います。場所が正しく報告されていません。

于 2012-07-06T18:35:53.170 に答える
0

JOIN_DTM無効な日付 (範囲外または単に null) があり、DATEDIFF が onit を実行して int に変換し、エラーが発生する可能性はありますか?

于 2012-07-06T18:23:26.927 に答える