2013-07-26 47 views
0

好吧,我知道這可能很難理解,隨意編輯它以便更有意義。基本上我想旋轉我的結果。我想選擇* from(從表中選擇col1,col2)tmp_table,但將tmp_table結果中的所有列作爲行。這裏是選擇將要tmp_table的:從另一個select中選擇列作爲每列的行

select 
txt_description_1 label_1, 
txt_description_2 label_2, 
txt_description_3 label_3, 
txt_description_4 label_4, 
txt_description_5 label_5, 
txt_description_6 label_6, 
txt_description_7 label_7, 
txt_description_8 label_8, 
txt_description_9 label_9, 
txt_description_10 label_10, 
txt_description_11 label_11, 
txt_description_12 label_12, 
txt_description_13 label_13, 
txt_description_14 label_14, 
txt_description_15 label_15, 
txt_description_16 label_16, 
txt_description_17 label_17, 
txt_description_18 label_18, 
txt_description_19 label_19, 
txt_description_20 label_20, 
txt_description_21 label_21, 
txt_description_22 label_22, 
txt_description_23 label_23, 
txt_description_24 label_24, 
txt_description_25 label_25, 
txt_description_26 label_26, 
txt_description_27 label_27, 
txt_description_28 label_28, 
txt_description_29 label_29, 
txt_description_30 label_30, 
txt_description_31 label_31, 
txt_description_32 label_32, 
txt_description_33 label_33, 
txt_description_34 label_34, 
txt_description_35 label_35, 
txt_description_36 label_36, 
txt_description_37 label_37, 
txt_description_38 label_38, 
txt_description_39 label_39, 
txt_description_40 label_40, 
txt_description_41 label_41, 
txt_description_42 label_42, 
txt_description_43 label_43, 
txt_description_44 label_44, 
txt_description_45 label_45, 
txt_description_46 label_46, 
txt_description_47 label_47, 
txt_description_48 label_48, 
txt_description_49 label_49, 
txt_description_50 label_50, 
txt_description_51 label_51, 
txt_description_52 label_52, 
txt_description_53 label_53, 
txt_description_54 label_54, 
txt_description_55 label_55, 
txt_description_56 label_56, 
txt_description_57 label_57, 
txt_description_58 label_58, 
txt_description_59 label_59, 
txt_description_60 label_60, 
txt_info2 label_info2 
from ngkbm_template_data_sets_ 
where practice_id = '0001' 
and txt_data_set = @dataSet 
and chk_label_values = 1 

因此,可以說是輸出如下:

Protocol Test Dx Code Dx Test Code Interval Start Age Stop Age Gender NULL NULL Test Code (Medicare) Test Code (Medicare, Hish Risk) Interval (High Risk) Start Age (High Risk) Stop Age (High Risk) NULL NULL Seq # for Series Pre-Requisite Exam Pre-Requisite Exam Seq # Class NULL Other ID NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL NULL Set Info/Reference: 

我想有它顯示是這樣的:

Protocol 
Test 
Dx Code 
Dx 
Test Code 
INTERVAL 
Start Age 
Stop Age 
Gender 
NULL 
NULL 

我對於SSRS 2005也是這樣做的,所以這些限制適用。另外,select將僅返回一行,因此處理多行不是問題。

回答

1

你可以使用CROSS APPLY

DECLARE @ngkbm_template_data_sets_ TABLE(
    id     INT IDENTITY(1,1) PRIMARY KEY, 
    txt_description_1 VARCHAR(50) NULL, -- or NVARCHAR,etc. 
    txt_description_2 VARCHAR(50) NULL, 
    txt_description_3 VARCHAR(50) NULL, 
    txt_description_4 VARCHAR(50) NULL 
); 

INSERT @ngkbm_template_data_sets_(txt_description_1,txt_description_2,txt_description_3,txt_description_4) 
VALUES ('Protocol','Test','Dx',NULL); 

SELECT x.id,y.* 
FROM @ngkbm_template_data_sets_ x 
CROSS APPLY(
    SELECT x.txt_description_1 AS Value, 'txt_description_1' AS ColumnName 
    UNION ALL 
    SELECT x.txt_description_2 AS Value, 'txt_description_2' AS ColumnName 
    UNION ALL 
    SELECT x.txt_description_3 AS Value, 'txt_description_3' AS ColumnName 
    UNION ALL 
    SELECT x.txt_description_4 AS Value, 'txt_description_4' AS ColumnName   
)y; 

結果:

id Value ColumnName 
-- -------- ----------------- 
1 Protocol txt_description_1 
1 Test  txt_description_2 
1 Dx  txt_description_3 
1 NULL  txt_description_4 

編輯1:下面的測試,這兩種解決方案(CROSS APPLY + UNION ALLUNION ALL only)具有從點相當的性能CPU timeelapsed time的視圖

CPU time = 156 ms, elapsed time = 2452 ms. 
vs. 
CPU time = 172 ms, elapsed time = 2344 ms. 

但從中LIOlogical reads)點的結果顯示了巨大的差異:

Table 'SalesOrderHeader'. Scan count 1, logical reads 686 
vs. 
Table 'SalesOrderHeader'. Scan count 6, logical reads 2881. 

實際執行計劃爲每一個解決方案顯示了這種差異的原因: enter image description hereCROSS APPLY + UNION ALL解決方案只使用一個Clustered Index Scan,但UNION ALL only解決方案使用四個Clustered Index Scan運營商和兩個Index Scan運營商。此外,每個查詢的估計總成本顯示SQL Server「認爲」CROSS APPLY + UNION ALL(39%)解決方案比UNION ALL only(61%)好一點。對於這個測試我使用了AdventureWorks2008 R2 database

SET NOCOUNT ON; 
SET STATISTICS IO,TIME ON; 
GO 
PRINT 'CROSS APPLY'; 
SELECT h.SalesOrderID,x.* 
FROM Sales.SalesOrderHeader h 
CROSS APPLY(
    SELECT h.SalesOrderNumber AS Value, 'SalesOrderNumber' AS RowType 
    UNION ALL 
    SELECT h.PurchaseOrderNumber, 'PurchaseOrderNumber' 
    UNION ALL 
    SELECT h.AccountNumber , 'AccountNumber' 
    UNION ALL 
    SELECT h.CreditCardApprovalCode , 'CreditCardApprovalCode' 
    UNION ALL 
    SELECT h.Comment , 'Comment'  
    UNION ALL 
    SELECT CONVERT(VARCHAR(36),h.rowguid) , 'rowguid' 
)x 
GO 
PRINT 'UNION ALL only'; 
SELECT h.SalesOrderID,h.SalesOrderNumber AS Value, 'SalesOrderNumber' AS RowType FROM Sales.SalesOrderHeader h 
UNION ALL 
SELECT h.SalesOrderID,h.PurchaseOrderNumber, 'PurchaseOrderNumber' FROM Sales.SalesOrderHeader h 
UNION ALL 
SELECT h.SalesOrderID,h.AccountNumber , 'AccountNumber' FROM Sales.SalesOrderHeader h 
UNION ALL 
SELECT h.SalesOrderID,h.CreditCardApprovalCode , 'CreditCardApprovalCode' FROM Sales.SalesOrderHeader h 
UNION ALL 
SELECT h.SalesOrderID,h.Comment , 'Comment' FROM Sales.SalesOrderHeader h  
UNION ALL 
SELECT h.SalesOrderID,CONVERT(VARCHAR(36),h.rowguid) , 'rowguid' FROM Sales.SalesOrderHeader h 
GO 

SET NOCOUNT OFF; 
SET STATISTICS IO,TIME OFF; 
GO 
/* 
-- Output 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

CROSS APPLY + UNION ALL 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 
Table 'SalesOrderHeader'. Scan count 1, logical reads 686, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 156 ms, elapsed time = 2452 ms. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

UNION ALL only 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 
Table 'SalesOrderHeader'. Scan count 6, logical reads 2881, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0. 

SQL Server Execution Times: 
    CPU time = 172 ms, elapsed time = 2344 ms. 
SQL Server parse and compile time: 
    CPU time = 0 ms, elapsed time = 0 ms. 

SQL Server Execution Times: 
    CPU time = 0 ms, elapsed time = 0 ms. 
*/ 
+0

哇,這讓我感覺有點愚蠢。我一直在尋找這種過於複雜或超級優雅的解決方案,但像往常一樣,我只是讓它比需要的更困難。 – jreed121

+1

現在我明白了。我改變了我對你說明的性能增益的查詢。 – jreed121

0

我真的不需要按照Bogdan Sahlean的建議使用APPLY。相反,簡單地結合一堆選擇在一起,然後從中選擇,消除了需要製作表變量或類似的東西...

SELECT name FROM (
SELECT 1 id, txt_description_1 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 2 id, txt_description_2 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 3 id, txt_description_3 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 4 id, txt_description_4 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 5 id, txt_description_5 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 6 id, txt_description_6 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 7 id, txt_description_7 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 8 id, txt_description_8 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 9 id, txt_description_9 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 10 id, txt_description_10 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 11 id, txt_description_11 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 12 id, txt_description_12 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 13 id, txt_description_13 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 14 id, txt_description_14 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 15 id, txt_description_15 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 16 id, txt_description_16 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 17 id, txt_description_17 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 18 id, txt_description_18 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 19 id, txt_description_19 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 20 id, txt_description_20 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 21 id, txt_description_21 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 22 id, txt_description_22 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 23 id, txt_description_23 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 24 id, txt_description_24 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 25 id, txt_description_25 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 26 id, txt_description_26 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 27 id, txt_description_27 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 28 id, txt_description_28 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 29 id, txt_description_29 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 30 id, txt_description_30 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 31 id, txt_description_31 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 32 id, txt_description_32 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 33 id, txt_description_33 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 34 id, txt_description_34 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 35 id, txt_description_35 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 36 id, txt_description_36 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 37 id, txt_description_37 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 38 id, txt_description_38 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 39 id, txt_description_39 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 40 id, txt_description_40 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 41 id, txt_description_41 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 42 id, txt_description_42 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 43 id, txt_description_43 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 44 id, txt_description_44 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 45 id, txt_description_45 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 46 id, txt_description_46 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 47 id, txt_description_47 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 48 id, txt_description_48 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 49 id, txt_description_49 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 50 id, txt_description_50 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 51 id, txt_description_51 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 52 id, txt_description_52 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 53 id, txt_description_53 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 54 id, txt_description_54 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 55 id, txt_description_55 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 56 id, txt_description_56 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 57 id, txt_description_57 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 58 id, txt_description_58 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 59 id, txt_description_59 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 60 id, txt_description_60 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 UNION 
SELECT 61 id, txt_info2 name FROM ngkbm_template_data_sets_ where practice_id = '0001' and txt_data_set = 'Protocols' and chk_label_values = 1 
) tmp_table 
ORDER BY id 
+1

1)我會使用'UNION ALL'而不是'UNION',因爲'UNION'強制SQL Server刪除重複的行。這意味着(通常)SORT(對大數據集的性能不利)。在這種情況下,我不認爲有必要刪除重複的行。 2)這個解決方案不會一次但是第60次讀取'ngkbm_template_data_sets_'表中的行。我的解決方案強制SQL Server只從「ngkbm_template_data_sets_」讀取一次數據。 –

+1

不會有重複,所以雖然不會有負面影響,但它不會有太大的影響,可能是某些表現的副作用。所有這些交叉應用中的聯合選擇不會導致查詢從表中讀取60次?也許我錯了,但看起來工會是否適用,還有60個選擇。 – jreed121

+1

1)也許在這種情況下,在SELECT子句中有一列有UNIQUE約束(只是一個示例示例),而SQL Server足夠聰明,可以從執行計劃中除去不必要的'Sort' /'Hash match'運算符。 2)非常好的問題。 「SELECT @ vars」和「SELECT columns FROM table」有區別。對於第一個'SELECT',SQL Server使用'Constant Scan'運算符。第二個'SELECT'生成邏輯(也許是物理)讀取。我改變了我的答案,並且包含了一個測試。請參閱** [編輯1] **部分。 –

相關問題