【问题标题】:SQL join two tables on subsets of dataSQL 在数据子集上连接两个表
【发布时间】:2020-06-14 16:43:49
【问题描述】:

我有两个表格,格式如下:

表 1

data_1      | data_2     |  weight  
 1          |   a        | 25   
 1          |   b        | 25 
 1          |   c        | 25 
 1          |   d        | 25 
 2          |   e        | 100

表 2

data_4     | data_1     | data_2     | value
 AB        | 1          | a          | 25 
 AB        | 1          | b          | 25 
 AB        | 1          | c          | 25 
 AB        | 1          | d          | 25 
 BC        | 2          | e          | 50 
 BC        | 2          | f          | 50 
 CD        | 1          | a          | 50 
 CD        | 1          | b          | 50 

我希望创建以下输出:

输出

data_4     | data_1     | data_2    | value    | weight
 AB        | 1          | a         | 25       | 25 
 AB        | 1          | b         | 25       | 25
 AB        | 1          | c         | 25       | 25
 AB        | 1          | d         | 25       | 25
 BC        | 2          | e         | 50       | 100
 BC        | 2          | f         | 50       | 0
 CD        | 1          | a         | 50       | 25
 CD        | 1          | b         | 50       | 25
 CD        | 1          | c         | 0          | 25
 CD        | 1          | d         | 0          | 25

基本上,我希望为每个 data_4 记录加入 data_1 和 data_2 上的表格,同时显示价值和权重及其对应的值。

我尝试了几件事,但似乎没有得到正确的输出。任何帮助将不胜感激。

【问题讨论】:

  • 给出你到目前为止所尝试的内容
  • (1) 使用您正在使用的数据库进行标记。 (2) 为什么 CD 会出现新行,而 BC 不会出现?
  • 因为在表 2 中您可以看到 BC 属于 [data_1] 类型 2,并且其中包含 [data_2] 类型 e 和类型 f。 [data_1] 类型 2 的目标是仅保存 [data_2] e。因此,输出表显示 BC 仍为 [data_1] 类型 2,并显示它持有 [data_2] e & f,其值分别为 50 和 50,但权重(目标权重)分别为 100 和 0。
  • CD 但是是 [data_1] 类型 1 并且当前持有 [data_2] 类型 a 和 b。 [data_1] 类型 1 的目标是持有 [data_2] a,b,c,d 每个权重为 25。因此它应该显示 [data_2] c&d 以及它当前在 [data_2] a &b 中的持有量。

标签: sql join outer-join


【解决方案1】:

如果我理解正确,这是相当复杂的。困难的部分(在我看来)是在第一列中获得正确的 data_4 —— full join 会产生 null 值。

以下方法从table_2 获取所有行并使用left join 匹配到table_1。然后添加left join 不包括的剩余行:

select t2.data_4, t2.data_1, t2.data_2, t2.value, coalesce(t1.weight, 0) as weight
from table2 t2 left join
     table1 t1
     using (data_1, data_2)
union all
select t2.data_4, t1.data_1, t1.data_2, t2.value, t1.weight
from table_1 t1 cross join
     (select distinct t2.data_4 from table2 t2) d4 left join
     table_2 t2
     on t2.data_4 = d4.data_4 and
        t2.data_1 = t1.data_1 and 
        t2.data_2 = t1.data_2
where t2.data_4 is null;

编辑:

嗯。 . .我认为可能有一个更简单的方法:

select t41.data_4, t41.data_1, t2.data_2,
       coalesce(t2.value, 0) as value,
       coalesce(t1.weight, 0) as weight
from (select distinct t2.data_4, t2.data_1 from table_2 t2) d41 left join
     table_1 t1
     on t1.data_1 = t41.data_1 left join
     table_2 t2
     on t2.data_4 = t41.data_4 and
        t2.data_1 = t41.data_1 and
        (t2.data_2 = t1.data_2 or t1.data_1 is null);

【讨论】:

  • 是的,完全联接不会添加表 1 中的其他 data_2 项。我认为上面看起来不错,但使用 dr. 时出现错误?
  • 当我运行上面的第一个时,我在 data_4 中得到 NULL 结果,而这些都应该被填充。其中两个 NULLS 似乎正在复制 BC - 2 - e weight = 1 行,但不包括 data_4 (BC),此时应该只有一条 BC 记录,data_1 = 2 和 data_2 = e。
  • 我似乎无法运行脚本 2 - 它没有选择 t41.[data_1]、t41.[data_4]、t2.[data_4] 或 t2.[data_1]。跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-26
  • 1970-01-01
  • 2012-02-28
  • 2012-05-01
相关资源
最近更新 更多