重構單表中的 UNION 系列 (SQL/SYBASE)
我正在嘗試查詢數據庫並重新格式化我感興趣的行/列。目前表 (EQ) 中的每一行代表表單中的一個欄位。實際上,有數百個 FieldNum 值;每個 EntityID “擁有”每個 FieldNum。每個 FieldNum 都有一個對應的 MemoText 值。在下面的範例中,FieldNum 1,2,3 是相關的,4,5,6 也是相關的。
EQ 和結果表應如下所示:
我需要從多個 FieldNum 值中創建一行,但我不確定如何在不使用 UNION ALL 的情況下執行此操作。考慮到我感興趣的所有數據都位於單個表中,使用七或八個 UNION 語句似乎非常低效。唉,我不確定如何重構程式碼以提高效率。我的程式碼範例如下。
Select En.EntityNum , En.EntityID, Test.Date, Test.Name1, Test.Name2 FROM En JOIN (SELECT EntityNum, Max(Case WHEN FieldNum = 1 Then Memotext End) as Date, Max(Case WHEN FieldNum = 2 Then Memotext End) as Name1, Max(Case WHEN FieldNum = 3 Then Memotext End) as Name2 FROM EQ WHERE Group by EntityNum UNION ALL (SELECT EntityNum, Max(Case WHEN FieldNum = 4 Then Memotext End) as Date, Max(Case WHEN FieldNum = 5 Then Memotext End) as Name1, Max(Case WHEN FieldNum = 6 Then Memotext End) as Name2 FROM EQ WHERE Group by EntityNum FROM EQ Group by EntityNum ) as Test ON test.EntityNum = En.EntityNum
我試圖盡可能地概括這個問題,但如果它仍然過於具體,一個概括的答案會完全令人滿意。
如果
FieldNum
使用整數除法將結果減去 1 並除以 3,您將得到FieldNum
1 到 6 的值的以下結果:FieldNum | (FieldNum - 1) / 3 ---------+------------------- 1 | 0 2 | 0 3 | 0 4 | 1 5 | 1 6 | 1
如果您替換
/
為%
(模運算符),結果將如下所示:FieldNum | (FieldNum - 1) % 3 ---------+------------------- 1 | 0 2 | 1 3 | 2 4 | 0 5 | 1 6 | 2
現在,如果這個想法還不清楚,除了(出於某種原因在您的查詢中呼叫)之外,該
(FieldNum - 1) / 3
表達式還可以用作分組標準。的結果可用於確定由 定義的子組內的特定行(可能是列)。EntityID``EntityNum``(FieldNum - 1) % 3``(FieldNum - 1) / 3
最後,如果我的口頭描述嘗試沒有真正成功,這裡有一個查詢,它使用上述兩個表達式來產生您所追求的結果:
SELECT EntityID, MAX(CASE (FieldNum - 1) % 3 WHEN 0 THEN Memotext END) AS Date, MAX(CASE (FieldNum - 1) % 3 WHEN 1 THEN Memotext END) AS Name1, MAX(CASE (FieldNum - 1) % 3 WHEN 2 THEN Memotext END) AS Name2 FROM EQ WHERE FieldNum BETWEEN 1 AND 6 GROUP BY EntityID, (FieldNum - 1) / 3 ;
在這裡你可以找到一個“現場”的 SQL Fiddle 展示。老實說,該展示使用 SQL Server 執行查詢,但我希望 Sybase 產生相同的結果。(我假設這
FieldNum
是一個整數類型的列,並且 Sybase 和 SQL Server 一樣,在 的兩個操作數/
都是整數時自動應用整數除法。)