2

私のテーブル構造は以下の通りです:

MyTable (ID Int, AccID1 Int, AccID2 Int, AccID3 int)

 ID      AccID1      AccID2      AccID3
----    --------    --------    --------
  1        12          2          NULL
  2        4           12           1
  3       NULL        NULL          5
  4        7          NULL          1   

以下の出力でインデックス付きビューを作成したい:

 ID    Level     Value
----   -----    -------
 1       1         12
 1       2         2 
 2       1         4
 2       2         12
 2       3         1
 3       3         5
 4       1         7
 4       3         1

編集 :

私のテーブルは非常に巨大で、上記の出力が必要です。以下のようなクエリを取得できます。

Select  ID,
        Case StrLevel
            When  'AccID1' Then 1
            When  'AccID2' Then 2
            Else 3
        End AS [Level],
        AccID as Value
From    (
        Select A.ID, A.AccID1, A.AccID2, A.AccID3
        From MyTable A
        )as p
UNPIVOT (AccID FOR [StrLevel] IN (AccID1, AccID2, AccID3)) AS unpvt

また

Select *
from (
        select MyTable.ID,
                num.n as [Level],
                Case Num.n
                    When 1 Then MyTable.AccID1
                    When 2 Then MyTable.AccID2
                    Else MyTable.AccID3
                End AS AccID
        from myTable
        cross join (select 1
                    union select 2
                    union select 3)Num(n)
    )Z
Where Z.AccID IS NOT NULL

また

    Select  A.ID,
            2 AS [Level],
            A.AccID1 AS AccID
     From MyTable A
     Where A.AccID1 IS NOT NULL

    Union

    Select  A.ID,
            2 AS [Level],
            A.AccID2
     From MyTable A
     Where A.AccID2 IS NOT NULL

    Union

    Select  A.ID,
            3 AS [Level],
            A.AccID3
     From MyTable A
     Where A.AccID3 IS NOT NULL  

しかし、上記のクエリは遅いので、パフォーマンスを向上させるためにインデックス付きビューが必要です。UNIONまた、インデックス付きビューではorUNPIVOTまたはインデックス付きビューでは使用できませんCROSS JOIN

4

1 に答える 1

2

Numbers テーブルを作成して、基本的に違法な作業を行うとしたらどうCROSS JOINでしょうか。

Create Table Numbers (number INT NOT NULL PRIMARY KEY) 
Go

Insert Numbers 
Select top 30000 row_number() over (order by (select 1)) as rn
from sys.all_objects s1 cross join sys.all_objects s2
go

Create view v_unpivot with schemabinding
as  
Select MyTable.ID,
        n.number as [Level],
        Case n.number
            When 1 Then MyTable.AccID1
            When 2 Then MyTable.AccID2
            Else MyTable.AccID3
        End AS AccID
From dbo.Mytable
Join dbo.Numbers n on n.number BETWEEN 1 AND 3 
go

Create unique clustered index pk_v_unpivot on v_unpivot (ID, [Level]) 
go

Select 
  ID,
  [Level],
  AccID
From v_unpivot with (noexpand)
Where AccID IS NOT NULL 
Order by ID, [Level]

派生テーブルはインデックス付きビューでは許可されていないため、クエリのWHERE AccID IS NOT NULL一部である必要があります。

于 2012-06-14T08:29:20.487 に答える