2016-11-28 45 views
-3

嗨,我需要連接我的表中的所有行。 我有這個查詢select * from table1;這個表包含400個字段 我不能這樣做select column1 ||','||column2||','||.....from table1 有人可以幫助e修復它使用select * from table1來協調所有行。 謝謝。在一行中連接所有行

+0

請標記您的dbms。 –

+1

這看起來像甲骨文呢?並且它似乎並不像你在拼接行......它好像你想組合列返回1列多行?如果情況並非如此,請發佈樣本數據和預期結果。 – xQbert

+0

如果使用db2或oracle查看LISTAGG()函數。 – Hogan

回答

-1

在Oracle(和其他類似數據庫管理系統),你可以使用系統表....做這兩個步驟:

假設你想要的所有列合併成1列X行...

步驟1:

SELECT LISTAGG(column_Name, '|| Chr(44)||') --this char(44) adds a comma 
      within group (order by column_ID) as Fields 
      --Order by column_Id ensures they are in the same order as defined in db. 
FROM all_tab_Cols 
WHERE table_name = 'YOURTABLE' 
    and owner = 'YOUROWNER' 
--Perhaps exclude system columns 
    and Virtual_Column = 'NO' 

步驟2:

將結果複製到新的SQL語句中並執行。 的看起來像Field1|| Chr(44)||Field2|| Chr(44)||Field3

SELECT <results> 
FROM YOURTABLE; 

這將導致一個逗號分隔值的列表中1列的YOURTABLE

所有行如果所有列(與空間和沿長度| |)將超過允許的4000個字符...我們可以通過,而不是使用XML對象使用CLOB數據類型...

*更換步驟1中帶*號

SELECT RTRIM(XMLAGG(XMLELEMENT(Column_ID,Column_Name,'|| Chr(44)||').extract('//text()') order by Column_ID).GetClobVal(),'|| Chr(44)||') fields 
FROM all_tab_Cols 
WHERE table_name = 'YOURTABLENAME' 
    and owner = 'YOUROWNER' 
--Perhaps exclude system columns 
    and Virtual_Column = 'NO'; 

上述歸因於This Oracle thread的語法,但更新了您的需要。

+0

問題我有一個400列有這樣的東西SELECT LISTAGG(*,'||,||')? – razzek

+0

你試過了嗎?第1步從指定的table.schema中選擇所有非虛擬列。步驟2然後選擇全部400列併合並它們。您只需將YOURTABLE和YOUROWNER更改爲架構並對其進行表格運行,然後將結果粘貼到第2步查詢中,並用您複製的內容替換。不要手動輸入全部400列。 – xQbert

+0

還是你得到一個字符串concat太長的錯誤? ORA-01489:字符串連接的結果太長 01489. 00000 - 「字符串連接的結果太長」 *原因:字符串連接結果大於最大大小。 *操作:確保結果小於最大尺寸.' – xQbert