【发布时间】:2014-03-27 22:41:08
【问题描述】:
我有两个表,A 和 B。B 是 A 的随机子集,但其中一些值覆盖了 A 中的默认值。如何连接这两个表以合并它们的值?
一个
1, 0
2, 0
3, 0
4, 0
B
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 是所有可能的配置文件属性的主列表。我希望查询返回带有叠加在其上的个人配置文件的主列表。
【问题讨论】:
-
你想要
a LEFT OUTER JOIN b,然后是coalesce。 -
谢谢!问题已更新响应...
-
uuid列在哪个表中? -
uuid 在 B 中。并且很抱歉 - 我的示例 A、B 颠倒了。我刚刚解决了这个问题(结果相同 - 只返回 B)。
-
" 但这会将输出集限制为 A 行和 B 行的交集"。不,它没有。我认为您可能需要显示与实际查询一起使用的表定义以及一些真实数据,因为左外连接肯定不会限制左侧的行。差不多就是这样的定义。你的问题似乎是你在
B.uuid上有一个where子句,除非B有一个非空值,否则它永远不会是真的;因此,您已经有效地将您的left outer join变成了inner join。
标签: sql postgresql left-join coalesce