2012-12-17 81 views
2

是否有更好(更高效)的方式來編寫此查詢?似乎應該有一種方法可以只寫一個UNION用多個UNION重寫SQL Server查詢

查詢:

SELECT 'Value1' as PropertyKey, PropertyValue=(SELECT Value1 FROM MyTable WITH (NOLOCK)) 
UNION 
SELECT 'Value2' as PropertyKey, PropertyValue=(SELECT Value2 FROM MyTable WITH (NOLOCK)) 
UNION 
SELECT 'Value3' as PropertyKey, PropertyValue=(SELECT Value3 FROM MyTable WITH (NOLOCK)) 
UNION 
... 
SELECT 'Value100' as PropertyKey, PropertyValue=(SELECT Value100 FROM MyTable WITH (NOLOCK)) 

最後,我需要我的結果集有2列(PropertyKeyPropertyValue)。 PropertyKey列中的值將是我表格中列的名稱,而PropertyValue列中的值將是相應的值。

如果我總是從同一張表中選擇,是否可以僅使用一個UNION來編寫此代碼?

回答

3

如果您有機會獲得UNPIVOT功能,您可以使用它的方式如下:

select PropertyKey, PropertyValue 
from yourtable 
unpivot 
(
    PropertyValue 
    for PropertyKey in (Value1, Value2, Value3) -- list other columns here 
) unpiv 

的關鍵部分要記住與UNPIVOT是數據類型必須是相同的,所以你可能需要轉換數據類型:

select PropertyKey, PropertyValue 
from 
(
    select CAST(value1 as varchar(10)), 
     CAST(value1 as varchar(10)), ... 
    from yourtable 
) src 
unpivot 
(
    PropertyValue 
    for PropertyKey in (Value1, Value2, Value3) -- list other columns here 
) unpiv 

你甚至可以動態地執行此,這將讓列的列表在運行時轉換:

DECLARE @colsUnpivot AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX)  

select @colsUnpivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('yourtable') 
     for xml path('')), 1, 1, '') 

set @query 
    = 'select PropertyKey, PropertyValue 
    from yourtable 
    unpivot 
    (
     PropertyValue 
     for PropertyKey in ('+ @colsunpivot +') 
    ) u' 

exec(@query) 

如果你被卡住,使用當前版本的話,我會稍微改變,並使用一個UNION ALL代替UNION的:

SELECT 'Value1' as PropertyKey, Value1 PropertyValue 
FROM MyTable 
UNION ALL 
SELECT 'Value2' as PropertyKey, Value2 PropertyValue 
FROM MyTable 
+0

感謝您的答覆!如果我沒有名爲PropertyKey和PropertyValue的列,unpivot示例是否工作?這些不是我實際的列名,但我需要他們以這種方式返回。例如,我的結果集將包含一個名爲PropertyKey的列,其中的所有記錄都會將我的實際列名作爲PropertyKey列中的值返回。希望這是有道理的。 – lhan

+0

@ lhan16「PropertyKey」將顯示列的名稱,「PropertyValue」將具有每列的值。 – Taryn

+0

謝謝。我收到的錯誤說「列'Value1'的類型與UNPIVOT列表中指定的其他列的類型衝突。」如果我的列類型不同,是否需要進行任何類型的投射? – lhan