Aynı satırdan birden fazla seçim için Birlik Tümünden daha iyi bir seçenek var mı?


10

Örnek Şema:

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

Aşağıdaki gibi sonuçlar elde etmenin bir yolu var mı:

ID | OptionID | OptionName | OptionLName

Bunu UNION ALL kullanarak başarmaya çalıştım ama bu benim örneğimde 3 kez aynı satır üzerinden geçmek anlamına geliyor, benim gerçek sorunumda 10 kez yapmak zorunda. Eski kod nedeniyle tabloyu normalleştiremiyorum. Taban satırının üzerinden yalnızca bir kez geçmenin bir yolu var mı?

Yanıtlar:


23

Sen kullanabilirsiniz CROSS APPLY ... VALUESiçin UNPIVOTbirden çok sütun

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

Bunun için yürütme planında bir tarama var Base. Bu plan aslında, 2005 yılı için uyumlu yeniden yazma ile aynıdır.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)  

Ama UNION ALLkaçınmaya çalıştığınızı sanıyorum ki

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] 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.