【问题标题】:Coalescing a subset to its parent set将子集合并到其父集
【发布时间】: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


【解决方案1】:

问题更新后:

作为@Craig already informed youB 上的WHERE 条件只会选择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';

【讨论】:

  • 抱歉,我没有完全说明我的问题。我已经更新它以反映为什么这个建议(这是我第一次尝试解决方案)不起作用。感谢您清理我的问题!
  • @metalaureate:问题仍然不完整。我添加了另一个版本。
  • 我不值得帮助,但谢谢。剩下的问题是我的左连接表不包含uuid。它是配置文件的模板,但配置文件包含多个不同的子集,由 uuid 区分。
  • 我搞混了,对不起。 A 不包含 uuid。只有 B。我想在 B 中选择相关配置文件并将其合并到 A。
猜你喜欢
  • 1970-01-01
  • 2017-01-28
  • 1970-01-01
  • 2019-02-12
  • 2023-03-18
  • 2016-05-02
  • 1970-01-01
  • 1970-01-01
  • 2011-03-24
相关资源
最近更新 更多