我有两个表,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是所有可能的配置文件属性的主列表。我希望查询返回主列表,并将个别配置文件叠加到其上。
答案 0 :(得分:1)
作为@Craig already informed you,WHERE
上的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';