首先,对我的数据库做一点解释。我在仓库工作,我有很多小册子,每个小册子都包含一些物品。 palets表称为" pal",对象的palet称为" inv"。每个"朋友"有自己的名字,名为" palid",它是表格的主键" pal"。每一个" inv"有自己的名字叫" invid"以及它所在的palet的名称。他们有更多的领域,但对我的问题并不重要。
我想要的是一个SQL查询,它向我显示每个" pal"与其所有" inv"匹配但不重复" pal"。让我给你举个例子:
pal_1 包含 inv_1 和 inv_2 ,
pal_2 包含 inv_3 ,
pal_3 不包含任何内容。
我想要这个:
pal_1 inv_1
NULL inv_2
pal_2 inv_3
pal_3 NULL
所以我创建了这个查询:
select pal.palid, inv.palid
from pal right outer join inv on pal.palid=inv.palid
但我明白了:
pal_1 inv_1
pal_1 inv_2
pal_2 inv_3
pal_3 NULL
我不想要重复这个pal_1,因为我有1000个寄存器,而且很难知道我的仓库的状态(如果我的包装中有很多物品)这个空白在我的查询上。
你知道怎么解决吗?
答案 0 :(得分:3)
这应该在表示层中完成。但是,如果您确实需要在数据库端完成,则可以使用ROW_NUMBER
:
SELECT
CASE
WHEN ROW_NUMBER() OVER(PARTITION BY p.palid ORDER BY(i.invid)) = 1
THEN p.palid
ELSE ''
END AS palid,
i.invid
FROM pal p
LEFT JOIN inv i
ON i.palid = p.palid
ORDER BY p.palid, i.invid
答案 1 :(得分:0)
你无法得到这样的结果
pal_1 inv_1
NULL inv_2
你可以通过这种方式得到关于你的东西:
select pal.palid, group_concat(inv.palid)
from pal
left join inv on pal.palid=inv.palid
group by 1
所以你得到了
pal_1 inv_1,inv_2
pal_2 inv_3
pal_3 NULL