Jus*_*ork 10 sql-server sql-server-2012
示例架构:
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,)
Run Code Online (Sandbox Code Playgroud)
有没有办法让结果显示如下:
ID | OptionID | OptionName | OptionLName
Run Code Online (Sandbox Code Playgroud)
我尝试使用 UNION ALL 来实现这一点,但这意味着在我的示例中,在同一行上重复 3 次,在我的实际问题中,我必须这样做 10 次。由于遗留代码,我无法对表进行规范化。有没有办法只遍历 Base 行一次?
Mar*_*ith 23
您可以使用CROSS APPLY ... VALUES
到UNPIVOT
多列
SELECT ID,
OptionID,
OptionName,
OptionLName
FROM [dbo].[Base]
CROSS APPLY (VALUES([Option1ID], [Option1Name], [Option1LName]),
([Option2ID], [Option2Name], [Option2LName]),
([Option3ID], [Option3Name], [Option3LName]))
V( OptionID, OptionName, OptionLName)
Run Code Online (Sandbox Code Playgroud)
为此的执行计划有一次扫描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)
Run Code Online (Sandbox Code Playgroud)
但我认为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]
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
13504 次 |
最近记录: |