2017-02-02 2 views
3

これはおそらく愚かな質問ですが、私は私はこのようなクエリがある これを把握することはできません。selectステートメントから選択を自己結合にすることはできますか?

select TERM_SID 
,max(PUBLICDATA) as PublicData 
,max(PUBLIC_AGGREGATE) as Public_AGGregate 
,max(INTERNAL) as Internal 
,max(INTERNAL_AGGREGATE) as internal_Aggregate 
,max(LIMITED) as Limited 
,max(RESTRICTED) as Restricted 
from 
(
     SELECT TERM_SID, 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data' THEN 'Y' ELSE 'N' END AS 'PUBLICDATA', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Public data in aggregate' THEN 'Y' ELSE 'N' END as 'PUBLIC_AGGREGATE', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data' THEN 'Y' ELSE 'N' END as 'INTERNAL', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Internal data in aggregate' THEN 'Y' ELSE 'N' END as 'INTERNAL_AGGREGATE', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Limited data' THEN 'Y' ELSE 'N' END as 'LIMITED', 
     CASE WHEN d2.DATA_CLASSIFICATION_DESC='Restricted data' THEN 'Y' ELSE 'N' END as 'RESTRICTED' 
     FROM [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION] d2 
     JOIN [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION_MAPPING] dm2 ON dm2.DATA_CLASSIFICATION_SID=d2.DATA_CLASSIFICATION_SID 
) mat 
group by Term_SID 

と私はそれを変換しようとしていますが、私は、内側の選択に参加することで、最大つまずい得続ける、ありますパフォーマンスを向上させるために結合を使用してこれを再構築する方法があります。

答えて

2
Common Table Expression(CTE)を使用して、派生テーブルにそれを回し

し、それが他のテーブルであるかのようにあなたはそれを参照することができます。

with mat as 
(
     SELECT TERM_SID 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Public data' THEN 'Y' ELSE 'N' END AS PUBLICDATA 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Public data in aggregate' THEN 'Y' ELSE 'N' END as PUBLIC_AGGREGATE 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Internal data' THEN 'Y' ELSE 'N' END as INTERNAL 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Internal data in aggregate' THEN 'Y' ELSE 'N' END as INTERNAL_AGGREGATE 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Limited data' THEN 'Y' ELSE 'N' END as LIMITED 
      ,CASE WHEN d2.DATA_CLASSIFICATION_DESC = 'Restricted data' THEN 'Y' ELSE 'N' END as RESTRICTED 
     FROM [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION] d2 
      JOIN [UDW_DATA_DICTIONARY].[dbo].[DATA_CLASSIFICATION_MAPPING] dm2 
       ON dm2.DATA_CLASSIFICATION_SID = d2.DATA_CLASSIFICATION_SID 
) 
select m1.TERM_SID 
     ,m1.max(PUBLICDATA) as PublicData 
     ,m1.max(PUBLIC_AGGREGATE) as Public_AGGregate 
     ,m1.max(INTERNAL) as Internal 
     ,m1.max(INTERNAL_AGGREGATE) as internal_Aggregate 
     ,m1.max(LIMITED) as Limited 
     ,m1.max(RESTRICTED) as Restricted 

     ,m2.count(1) as mat2count 
from mat m1 
    left join mat m2 
     on(m1.TERM_SID = m2.TERM_SID) 
group by Term_SID 
関連する問題