2016-11-28 47 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