Sybase

重構單表中的 UNION 系列 (SQL/SYBASE)

  • August 4, 2012

我正在嘗試查詢數據庫並重新格式化我感興趣的行/列。目前表 (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,您將得到FieldNum1 到 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 一樣,在 的兩個操作數/都是整數時自動應用整數除法。)

引用自:https://dba.stackexchange.com/questions/21904