같은 행에서 여러 선택을 할 때 Union All보다 더 나은 옵션이 있습니까?


10

스키마 예 :

CREATE TABLE [dbo].[Base](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Option1ID] [int] NULL,
[Option2ID] [int] NULL,
[Option3ID] [int] NULL,
[Option1Name] [varchar] NULL,
[Option2Name] [varchar] NULL,
[Option3Name] [varchar] NULL,
[Option1LName] [varchar] NULL,
[Option2LName] [varchar] NULL,
[Option3LName] [varchar] NULL,)

다음과 같은 결과를 얻는 방법이 있습니까?

ID | OptionID | OptionName | OptionLName

UNION ALL을 사용하여 이것을 달성하려고 시도했지만 이것은 내 예제에서 동일한 행을 3 번 반복한다는 것을 의미합니다. 실제 문제에서는 10 번해야합니다. 레거시 코드로 인해 테이블을 정규화 할 수 없습니다. 기본 행을 한 번만 통과 할 수있는 방법이 있습니까?

답변:


23

당신은 사용할 수 있습니다 CROSS APPLY ... VALUESUNPIVOT여러 열

SELECT ID,
       OptionID,
       OptionName,
       OptionLName
FROM   [dbo].[Base]
       CROSS APPLY (VALUES([Option1ID], [Option1Name], [Option1LName]),
                          ([Option2ID], [Option2Name], [Option2LName]),
                          ([Option3ID], [Option3Name], [Option3LName])) 
                     V( OptionID, OptionName, OptionLName) 

이에 대한 실행 계획에는 한 번의 스캔이 Base있습니다. 이 계획은 실제로 다음을 사용하는 2005 호환 재 작성과 동일합니다.UNION ALL

SELECT ID,
       OptionID,
       OptionName,
       OptionLName
FROM   [dbo].[Base]
       CROSS APPLY (SELECT [Option1ID], [Option1Name], [Option1LName] UNION ALL
                    SELECT [Option2ID], [Option2Name], [Option2LName] UNION ALL
                    SELECT [Option3ID], [Option3Name], [Option3LName]) 
                     V( OptionID, OptionName, OptionLName)  

그러나 나는 UNION ALL당신이 피하려고 했던 것으로 여러 번 스캔했다고 가정합니다.

SELECT ID,
       [Option1ID],
       [Option1Name],
       [Option1LName]
FROM   [dbo].[Base]
UNION ALL
SELECT ID,
       [Option2ID],
       [Option2Name],
       [Option2LName]
FROM   [dbo].[Base]
UNION ALL
SELECT ID,
       [Option3ID],
       [Option3Name],
       [Option3LName]
FROM   [dbo].[Base] 
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.