繁体   English   中英

在PostgreSQL中将多行合并为单行

[英]Combining multiple rows into single row in postgresql

我有以下查询:

SELECT distinct items.matr_code,mm_nounmodmaster.noun,mm_nounmodmaster.modifier1,mm_nounmodmaster.modifier2,mm_attributemaster.attribute, mm_templateattributes.sequence, 
mm_itemvaluemaster.itemvalue, mm_itemvaluemaster.abbrvalue, mm_templateattributes.mand_ind, mm_sourcemaster.source_code
FROM mm_items items
      INNER JOIN mm_nounmodmaster ON items.nm_code = mm_nounmodmaster.nm_code 
      INNER JOIN mm_itemattributes ON items.id = mm_itemattributes.items_id
      INNER JOIN mm_itemvaluemaster ON mm_itemattributes.itemvalmaster_id = mm_itemvaluemaster.id
      INNER JOIN mm_templateattributes ON mm_itemattributes.templateattributes_id = mm_templateattributes.id
      INNER JOIN mm_attributemaster ON mm_templateattributes.attribute = mm_attributemaster.id
      INNER JOIN mm_sourcemaster ON mm_itemattributes.source = mm_sourcemaster.id
      WHERE items.matr_code='01102027001' group by items.matr_code,mm_attributemaster.attribute, mm_templateattributes.sequence, 
mm_itemvaluemaster.itemvalue, mm_itemvaluemaster.abbrvalue, mm_templateattributes.mand_ind, mm_sourcemaster.source_code,mm_nounmodmaster.noun,mm_nounmodmaster.modifier1,mm_nounmodmaster.modifier2;

这给了我:

matr_code  |noun|mod1| mod2 |  attr  |seq | i_val | a_val  |m_ind|source

01102027001|ABRA|  --  | -- |ITEM NAME|10 | EMERY | EMERY  | Y   | --
01102027001|ABRA|  --  | -- |TYPE     |20 | --    | --     | Y   | test    
01102027001|ABRA|  --  | -- |MATERIAL |30 | --    | --     | Y   | test
01102027001|ABRA|  --  | -- |SIZE,GRIT|40 | 100   | 100    | Y   | test
01102027001|ABRA|  --  | -- |DIMENSION|50 | 280mm | 280mm  | Y   | --
01102027001|ABRA|  --  | -- |ADDITIONAL|60| DRILL | DRILL  | N   | test

根据上述结果,matr_code,名词,mod1和mod2相同,但其他字段有所不同,因此上述结果中总共有6行,但需要单行中的结果,下面为您的引用附加了图像。

结果将在单行中

您想要的结果不是1NF,因为您想返回一条记录中的结果列表(例如,对于键01102027001|ABRA|--|-- ,您将希望获得ITEM NAME|10 | EMERY | EMERY | Y | --TYPE |20 | -- | -- | Y | test ,依此类推)。 对于纯关系型sql查询,这很难(甚至不可能)实现,实际上,很少有人希望这样做。

关系数据库(和prostgresql)可以处理NON-1NF结构,例如通过使用嵌套表或XML输出。 但是,调整表示层以使公共部分01102027001|ABRA|--|--仅打印一次可能会容易得多。

您可能要尝试使用DISTINCT ON (matr_code, mod1, mod2)而不是仅使用DISTINCT ,并对所有其他不同的列使用array_agg(column_name_here)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM