Có lựa chọn nào tốt hơn Union All cho nhiều lựa chọn từ cùng một hàng không?


10

Lược đồ ví dụ:

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,)

Có cách nào để có được kết quả hiển thị như sau:

ID | OptionID | OptionName | OptionLName

Tôi đã cố gắng đạt được điều này bằng cách sử dụng UNION ALL nhưng điều này có nghĩa là vượt qua cùng một hàng 3 lần trong ví dụ của tôi, trong vấn đề thực sự của tôi, tôi phải làm điều đó 10 lần. Tôi không thể bình thường hóa bảng do mã kế thừa. Có cách nào để chỉ đi qua hàng Base một lần không?

Câu trả lời:


23

Bạn có thể sử dụng CROSS APPLY ... VALUESđể UNPIVOTnhiều cột

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

Kế hoạch thực hiện cho việc này có một lần quét Base. Kế hoạch trên thực tế giống như viết lại tương thích năm 2005 sử dụngUNION 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)  

Nhưng tôi cho rằng UNION ALLbạn đang cố tránh là nhiều lần quét

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] 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.