2009-12-05 38 views
1

我有一個表類似於下面的以下內容:在沒有使用UNION的情況下將一行換成MySQL的列?

 id |  cat |   one_above |  top_level | 
     0 'printers'   'hardware'  'computers' 

我希望能夠編寫一個查詢,不使用工會,將返回我調換此表的列到結果集行。這意味着,我想要的結果是:

 id |   cat | 
     0  'printers' 
     0  'hardware' 
     0  'computers' 

這是可能的MySQL?我無法下載到應用程序層並執行此操作,因爲我將這些內容提供給將根據ID進行索引的搜索引擎。其他各種DBMS有類似PIVOT和UNPIVOT。我很感激任何見解,我失蹤的東西。

Mahmoud

P.S.

我在考慮重新規範化數據庫作爲最後一個選項,因爲這不是一項簡單的任務。

謝謝!

+0

當前不可能MySql – 2009-12-05 10:24:29

+0

爲什麼是這個社區Wiki? – 2009-12-05 10:50:14

+0

SQL Server 2005+和Oracle 11g +支持PIVOT/UNPIVOT。我不知道任何其他數據庫支持語法。 – 2009-12-05 19:18:58

回答

1

我得到這個出書The Art of SQL,284-286頁:

比方說,你的表名是foo

首先,創建一個名爲pivot表:

CREATE Table pivot (
    count int 
); 

插入到該表中的許多行,因爲有要在foo轉動列。既然你有foo三列要轉動,在數據透視表中創建三行:

insert into pivot values (1); 
insert into pivot values (2); 
insert into pivot values (3); 

現在做一個笛卡爾foopivot之間的連接,使用CASE基於計數來選擇正確的列:

SELECT foo.id, Case pivot.count 
    When 1 Then cat 
    When 2 Then one_above 
    When 3 Then top_level 
End Case 
FROM foo JOIN pivot; 

這應該給你你想要的。

+0

謝謝巴里,我會嘗試這樣的事情,看看它是否有效。 – 2009-12-06 00:09:39

0

經過一些相當廣泛的挖掘,我偶然發現了this page,這可能會或可能不會包含您的答案。這在MySQL中很困難,但從概念角度來看,我可以構造一個查詢,使用describe進行轉置(儘管它可能會非常糟糕)。所以我相信我們可以找到一種正確的方法。

相關問題