2015-09-18 80 views
2

採取以下表:返回塔B的所有不同的值在每一行對應一個不同的值在列A

CREATE TABLE boxes (
    box integer, 
    color character varying, 
    size integer, 
    ... 
); 

其中兩個boxcolor可以假設出來的小 組不是唯一的值。

查詢該表:

SELECT color, box FROM boxes; 

結果會是這樣的:

+-------+-----+ 
| color | box | 
+-------+-----+ 
| blue | 2 | 
| blue | 3 | 
| blue | 4 | 
| green | 1 | 
| green | 3 | 
| red | 1 | 
| red | 2 | 
| red | 2 | 
+-------+-----+ 

是否可以查詢該表以這樣的方式,其結果有兩列,一用一個數組(或字符串或列表),每個不同的color具有所有不同的box值?

結果應該是這樣的:

+-------+-----------+ 
| color | box_types | 
+-------+-----------+ 
| blue | {2,3,4} | 
| green | {1,3}  | 
| red | {1,2}  | 
+-------+-----------+ 

其中color列必須包含唯一值,並且每行必須包含在總量列只不同box數字。

考慮到這個問題的不可知論性質,我想收集主要DBMS的所有最佳解決方案。在回答時,請指定每個查詢的DBMS的工作方式。

+1

這不是一個真正的SQL的方式來做事。但是,一些dbms產品具有像GROUP_CONCAT和STUFF這樣的功能。 – jarlh

+0

我想有人必須將所有的答案合併成一個...... – xpy

+0

是的,這就是意圖。 –

回答

1

那麼,在MySQL中,你可以做到以下幾點:

select color, group_concat(box) from tbl group by color 

在Oracle:

select color, wm_concat(box) from tbl group by color 
+1

沒有必要添加大括號,它們在你使用數組列而不是一個字符串進行分組的情況下的答案。所以'選擇顏色,group_concat(box)FROM boxes GROUP BY color;'可以很好,如果你找到方法來獲取每個'color'的所有不同的'box'數字。 –

+0

@ClaudioFloreani:好的,我在那之前聽說過你,編輯過答案) – potashin

3

下面嘗試。

SELECT 
    color , 
    STUFF(
     (SELECT DISTINCT ',' +CONVERT(varchar(10), box) 
      FROM boxes 
      WHERE color = a.color 
      FOR XML PATH ('')) 
      , 1, 1, '') AS box_types 
FROM boxes AS a 
GROUP BY color; 

檢查SQL Fiddle

+0

這是MS SQL Server的有效答案。請注意大括號在答案,因爲它是一個數組列,而不是一個字符串。我已將它們從您的答案中刪除。 –

0

首先,這是「正常化」,換句話說,它是「壞」的原則否定。

但是,有一些dbms與Microsoft SQL Server一樣,通過子句PIVOT(及其相反的UNPIVOT)實現了這種可能性。

該條款允許創建一個表(使用你的例子)是這樣的:

 
+-------+------+------+------+ 
| color | box1 | box2 | box3 | 
+-------+------+------+------+ 
| blue | 2 | 3 | 4 | 
| green | 1 | 3 | null | 
| red | 1 | 2 | null | 
+-------+------+------+------+ 
+0

我認爲你需要知道確切的 - 要生產 - 列以便使用'PIVOT' – xpy

+0

現代DBMS支持數組列。如果他們「否定正常化原則」,這不會阻止用戶從其使用中獲益。最後,它只是一種轉換數據的方式,以便它們更適合您的需求。假設你的數據存儲在一個數據庫表中,但你需要以不同的方式在另一個數據庫表中使用它們。在例子中,「每種顏色的所有不同的盒子編號」都只是一個值。 –

+0

你是對的,但是 - 正如我所知道的 - 如果它不是第五範式,就不能稱之爲RDBMS。這張桌子甚至沒有在第三! –

相關問題