[英]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.