左外连接只有一个匹配

时间:2016-06-17 06:43:45

标签: sql sql-server join

首先,对我的数据库做一点解释。我在仓库工作,我有很多小册子,每个小册子都包含一些物品。 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个寄存器,而且很难知道我的仓库的状态(如果我的包装中有很多物品)这个空白在我的查询上。

你知道怎么解决吗?

2 个答案:

答案 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