【问题标题】:How to join multiple uneven views如何加入多个不均匀的视图
【发布时间】:2019-07-03 00:34:20
【问题描述】:

我想加入具有不均匀数据的多个视图。让我用示例数据解释一下

视图1:

DATE | COL2
150 rows

视图2:

DATE | COL3
30 rows

视图3:

DATE | COL4
15 rows

所以我想获取如下数据:

输出:

DATE | COL2 | COL3 | COL4
150 rows with nulls on some columns

DATE 列是 MONTH:YEAR,例如 02/2019。每个视图都由 DATEPART MONTH 和 YEAR 列组成,并集中在一个列中。所以我不想有重复的 DATE 行。

【问题讨论】:

  • LEFT JOIN/FULL OUTER JOIN?一些样本数据和预期结果可以回答这个问题。
  • 你说得对,让我编辑问题。完全外部联接不起作用

标签: sql sql-server


【解决方案1】:

在 SQL Server 中,可以使用full join:

select coalesce(v3.date, v2.date, v1.date) as date, v1.col2, v2.col3, v3.col4
from view1 v1 full join
     view2 v2
     on v2.date = v1.date full join
     view3 v3
     on v3.date = coalesce(v2.date, v1.date);

这比left join 解决方案更可取,因为每个视图只能访问一次,因此视图中的任何代码都不会多次运行。

【讨论】:

    【解决方案2】:

    您可以根据日期的并集使用左联接

    select t1.date, v1.COL2, v2.COL3, v3.COL4
    from(
    
      select date from view1
      union
      select date from view2
      union
      select date from view2
    
    ) t1 
    left join view1 v1 on t1.date = v1.date 
    left join view2 v2 on t1.date = v2.date 
    left join view1 v3 on t1.date = v3.date 
    

    【讨论】:

    • 如果 v2 有更多的日期行怎么办?
    • 哇!谢谢。我不知道为什么以及如何,但这有效。您能否解释一下为什么即使主视图的日期最少,它也没有跳过日期行?
    • 问题说 v1 有 150 行,v2 有 30 行(在这个例子中)。但你可能的意思是日期超出了 v1 的范围,但是联合运算符丢失了欺骗然后左边加入意味着所有日期都被表示等等......
    • 然后从子选择中只需选择所有 3 个表中存在的不同日期 .. 基于不同日期的集合,每个视图为 macthing 连接 .. 行 .. 评估返回的行数您只需要查看表单子选择的结果
    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2014-08-22
    • 1970-01-01
    相关资源
    最近更新 更多