2017-05-27 11 views
1

後CTEの変化:データは、私はこのようなクエリを持っているSELECTクエリ

USE [MyDataBase] 
GO 
DECLARE @day DATE = '2017-05-18' 
DECLARE @camp VARCHAR(500) = '9015'; 
WITH ODCALLS AS (SELECT * FROM [dbo].[ODCalls_2017_05] 
    WHERE CONVERT(DATE, CallLocalTime) = @day AND LastCampaign = @camp AND CallType = 1 
) 

SELECT COUNT(*) FROM ODCALLS -- this returns 2998 
SELECT DATEPART(HOUR, CallLocalTime) AS dHOUR, COUNT(*) AS [Calls Received] 
    FROM ODCALLS 
    GROUP BY DATEPART(HOUR, CallLocalTime) 
    ORDER BY dHOUR -- this returns 24 rows as there are 24 hours in a day 
SELECT COUNT(*) FROM ODCALLS -- this returns 2907 

インスタンスがOdCalls_2017_05テーブルにSQL Server Expressの2014年のデータである「ここでは、のプレビューを変更しません結果:

なぜこのようなことが起こるのかわかりません。何か説明がありますか?

ありがとうございました

+0

クエリが機能する場合は、データベース/スキーマに 'ODCalls'というテーブルがあります。 –

+0

私はそうは思わない – Fourat

答えて

2

私は驚いています。共通テーブル式はではなく、は一時テーブルのように動作します。クエリは、次のクエリへの入力として使用され(ビューのように)、後続のクエリとCTEの両方で最適化が実行されるため、CTEの結果セットは決して単独で存在することはありません。

その後のCTEの呼び出しは、CTEの定義に違反するため、機能しません。詳細については、https://blogs.sentryone.com/aaronbertrand/backtobasics-ctes/を参照してください。

関連する問題