Sql 如何连接多个不均匀视图

Sql 如何连接多个不均匀视图,sql,sql-server,Sql,Sql Server,我想用不均匀的数据连接多个视图。让我用样本数据解释一下 视图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 日期列为月份:年份,如2019年2月。每个视图都包含DATEPART月和年列,并集中在一个列中。因此,我不希望有重复的日期行。您

我想用不均匀的数据连接多个视图。让我用样本数据解释一下

视图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

日期列为月份:年份,如2019年2月。每个视图都包含DATEPART月和年列,并集中在一个列中。因此,我不希望有重复的日期行。

您可以使用基于日期并集的左联接

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 

在SQL Server中,可以使用
完全联接

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);

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

左联接
/
完全外部联接
?一些样本数据和预期的结果将使这个问题有答案。你是对的,让我来编辑这个问题。如果v2有更多的日期行怎么办?哇!非常感谢。我不知道为什么,如何,但这是可行的。你能解释一下为什么即使主视图的日期最少,它也没有跳过日期行吗?问题是v1有150行,v2有30行(在本例中)。但您的意思可能是日期超出v1的范围,但union运算符会丢失重复项,然后左连接意味着表示所有日期等。无论如何,如果v2有更多行,左连接意味着t1中的所有日期都在第一次连接中表示(使用v1)如果您愿意,v2和v3将只处理这些日期。然后从subselect中选择所有3个表中存在的不同日期。。根据一组不同的日期,每个视图都会连接到macthing。。一行对于eval返回的行数,您只需要查看formsubselect的结果