将子集合并到其父集

时间:2014-03-27 05:48:35

标签: sql postgresql left-join coalesce

我有两个表,A和B. B是A的随机子集,但有一些值覆盖A中的默认值。如何连接两个表来合并它们的值?

A

1, 0
2, 0
3, 0
4, 0

2, 10
3, 11

输出

1, 0
2, 10
3, 11
4, 0

这是我的实际查询 - 我认为我可以使用LEFT OUTER JOIN执行此操作,但这会将输出设置限制为A和B行的交集。我需要返回所有A行,与相关的B行合并。

SELECT A.factor, A.categorical_value, coalesce(A.positive, B.positive),  coalesce(A.negative, B.negative) 
FROM features A 
LEFT OUTER JOIN profiles B ON (A.factor=B.factor AND A.categorical_value=B.categorical_value)
WHERE B.uuid='9e5083da74305628336631da9d2903e3' 

正如Craig Ringer在下面指出的那样,我无意中用我的B条款来限制A.但那我该怎么做?表A是配置文件属性的多对多表,其中uuid表示用户ID。表B是所有可能的配置文件属性的主列表。我希望查询返回主列表,并将个别配置文件叠加到其上。

1 个答案:

答案 0 :(得分:1)

更新问题后:

作为@Craig already informed youWHERE上的B条件只会选择B中的匹配行,而行为就像[INNER] JOIN而不是LEFT [OUTER] JOIN }。

您需要将WHERE条件提升到状态,进入LEFT JOIN 的条件。
在此期间,我用USING进行了简化,因为所有连接列名都相同。 Details in the manual.

信息仍然不完整且矛盾。这是另一个有根据的猜测:

SELECT a.factor, a.categorical_value
     , COALESCE(a.positive, b.positive) AS positive
     , COALESCE(a.negative, b.negative) AS negative 
FROM   features a 
LEFT  JOIN profiles b USING (factor, categorical_value, uuid)
WHERE  a.uuid='9e5083da74305628336631da9d2903e3'

不确定您是否也需要加入udid 您的示例将指示COALESCE(b.positive, a.positive)。有些事情没有加起来......

评论中的更多更新

然后调整您的JOIN条件:

SELECT a.factor, a.categorical_value
     , COALESCE(a.positive, b.positive) AS positive
     , COALESCE(a.negative, b.negative) AS negative 
FROM   features a 
LEFT   JOIN profiles b ON a.factor = b.factor
                      AND a.categorical_value = b.categorical_value
                      AND b.uuid='9e5083da74305628336631da9d2903e3';