我有以下查询:
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,noun,mod1和mod2是相同的,但是其他字段有所不同,所以在上面的结果中总共有6行,但需要在单行中得到结果,下面我为你的Ref附加了图像。
答案 0 :(得分:0)
您想要的结果不是1NF,因为您想要在单个记录中返回结果列表(例如,对于密钥01102027001|ABRA|--|--
,您希望获得ITEM NAME|10 | EMERY | EMERY | Y | --
,TYPE |20 | -- | -- | Y | test
,等等)。使用纯粹的关系型SQL查询,这很难(甚至不可能)实现,而且实际上很少需要这种方式。
关系数据库(和prostgresql)可以处理NON-1NF结构,例如通过使用嵌套表或XML输出。但是,调整表示层可能要容易得多,因此公共部分01102027001|ABRA|--|--
只打印一次。
答案 1 :(得分:0)
您可能希望尝试使用DISTINCT ON (matr_code, mod1, mod2)
而不只是DISTINCT
,并对所有其他不同的列使用array_agg(column_name_here)
。