2012-08-27 19 views
5

B等方式我在Oracle數據庫兩列如何檢索所述的兩點中的數據,在Oracle

+---------+---------+ 
| Column1 | Column2 | 
+---------+---------+ 
| A  | 1  | 
| A  | 2  | 
+---------+---------+ 

我想retireive數據就像我會得到的數據作爲結果

+---------+---------+ 
| Column1 | Column2 | 
+---------+---------+ 
| A  | 1,2  | 
+---------+---------+ 

請爲我提供解決方案。

+0

我已經編輯你的問題,看看代碼模式的線,你可以確認這就是你的意思......哎呀,bluefeet捏造我編輯。 – boisvert

+0

[行列中的列值可能重複](http://stackoverflow.com/questions/9482560/column-values-in-a-row) –

+0

[在Oracle中構建逗號分隔列表值的可能重複SQL語句](http://stackoverflow.com/questions/5822700/building-a-comma-separated-list-of-values-in-an-oracle-sql-statement) – DCookie

回答

16

蒂姆霍爾有一個漂亮的標準清單string aggregation techniques in Oracle

您使用的技術取決於許多因素,包括Oracle的版本以及您是否在尋找純粹的SQL解決方案。如果您使用的是Oracle 11.2,我可能會建議使用LISTAGG

SELECT column1, listagg(column2, ',') WITHIN GROUP(order by column2) 
    FROM table_name 
GROUP BY column1 

如果您使用的是Oracle的早期版本,假設你不需要一個純粹的SQL解決方案,我想一般喜歡使用user-defined aggregate function方法。

+0

賈斯汀,如果我們需要在多列上進行分組,請問這個查詢是否可以工作?謝謝。 – Jimmy

+0

@Jimmy - 是的,它應該。 –

+0

有關其他詳細信息,請訪問http://docs.oracle.com/cd/E11882_01/server.112/e10592/functions089.htm#SQLRF55593 –

1

如果你有10g中,那麼你必須要經過以下功能:

CREATE OR REPLACE FUNCTION get_comma_separated_value (input_val in number) 
    RETURN VARCHAR2 
IS 
    return_text VARCHAR2(10000) := NULL; 
BEGIN 
    FOR x IN (SELECT col2 FROM table_name WHERE col1 = input_val) LOOP 
    return_text := return_text || ',' || x.col2 ; 
    END LOOP; 
    RETURN LTRIM(return_text, ','); 
END; 
/

所以,你可以這樣做:

select col1, get_comma_separated_value(col1) from table_name 

Fiddle here

如果你有oracle 11g,可以使用listagg

SELECT 
    col1, 
    LISTAGG(col2, ', ') WITHIN GROUP (ORDER BY col2) "names" 
FROM table_x 
GROUP BY col1 

Fiddle here for Listagg

對於MySQL,它會是簡單的:

SELECT col1, GROUP_CONCAT(col2) FROM table_name GROUP BY col1 
相關問題