क्या एक ही पंक्ति से कई चयनों के लिए यूनियन ऑल से बेहतर विकल्प है?


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

इसके लिए निष्पादन योजना में एक स्कैन है 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] 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.