Sql 多个键上的完全外部联接

Sql 多个键上的完全外部联接,sql,hive,Sql,Hive,我有两个表(A和B),我想在3个字段(部门id、地区id、原产地id)上合并它们。每个表都包含一个值字段。我想做的是合并这两个表,得到两个值之间的差值。我遇到的问题是,复合字段组合(department\u id、region\u id、origin\u id没有空值)不一定存在于两个表中。当我运行下面的查询时,我得到的记录比我预期的要多(~2x),所以我想知道查询是否是错误的。这是在蜂箱里 SELECT COALESCE(A.department_id, B.department_id)

我有两个表(A和B),我想在3个字段(部门id、地区id、原产地id)上合并它们。每个表都包含一个值字段。我想做的是合并这两个表,得到两个值之间的差值。我遇到的问题是,复合字段组合(department\u id、region\u id、origin\u id没有空值)不一定存在于两个表中。当我运行下面的查询时,我得到的记录比我预期的要多(~2x),所以我想知道查询是否是错误的。这是在蜂箱里

SELECT
  COALESCE(A.department_id, B.department_id) AS department_id,
  COALESCE(A.region_id, B.region_id) AS region_id,
  COALESCE(A.origin_id, B.origin_id) AS origin_id,
  COALESCE(A.value, CAST(0 AS BIGINT)) - COALESCE(B.value, CAST(0 AS BIGINT)) AS delta_value
FROM
  A FULL OUTER JOIN B
  ON A.department_id = B.department_id
  AND A.region_id = B.region_id
  AND A.origin_id = B.origin_id
如果您得到的记录比预期的多,这可能是因为一个或两个表中都有重复的记录。因此,运行这些查询以查看重复项的位置:

select department_id, region_id, origin_id, count(*)
from a
group by department_id, region_id, origin_id
having count(*) >= 2;

select department_id, region_id, origin_id, count(*)
from b
group by department_id, region_id, origin_id
having count(*) >= 2;

任何
join
都将为每个键值组合生成笛卡尔积,如果两个表都有重复项。

其他人怎么知道?没有人知道你期望什么。示例数据和期望的结果将非常有用,对您要实现的逻辑进行清晰的解释也是如此。为什么要对表进行完全联接?@forpas我正在获取两个表之间的增量值,但两个表中可能都缺少段组合。在这些情况下,我仍然希望得到结果的差异。源表没有重复项,但您的回答让我通过对结果数据集运行相同类型的count+have来验证我是否有“更多”记录。事实证明,我在真实数据集中的一列中有空值(100多个字段,因此很难为我的原始问题生成样本集)。