如何创建连接2个表的视图?

SaT*_*SaT 0 sql-server

我有两个表,我试图从中创建视图。我遇到的问题是我要加入的列在两个表中都没有相同的值。

这是我的表结构。

表格1

+-----+------+-------+
| bln | thn  | qty1  |
+-----+------+-------+
|   1 | 2014 |    10 |
|   1 | 2014 |    20 |
|   2 | 2014 |    30 |
|   3 | 2014 |    40 |
|   2 | 2014 |    50 |
|   4 | 2014 |    60 |
+-----+------+-------+
Run Code Online (Sandbox Code Playgroud)

表 2

+-----+------+------+
| bln | thn  | qty2 |
+-----+------+------+
|   3 | 2014 |  200 |
|   5 | 2014 |  400 |
|   2 | 2014 |  100 |
|   2 | 2014 |  500 |
|   4 | 2014 |  300 |
|   6 | 2014 |  600 |
+-----+------+------+
Run Code Online (Sandbox Code Playgroud)

视图的结果应该是:

+-----+------+------+------+
| bln | thn  | qty1 | qty2 |
+-----+------+------+------+
|   1 | 2014 |   30 |    0 |
|   2 | 2014 |   80 |  600 |
|   3 | 2014 |   40 |  200 |
|   4 | 2014 |   60 |  300 |
|   5 | 2014 |    0 |  400 |
|   6 | 2014 |    0 |  600 |
+-----+------+------+------+
Run Code Online (Sandbox Code Playgroud)

Tar*_*ryn 5

要获得您想要的结果,您似乎需要使用FULL JOIN. FULL JOIN 将连接bln列上的 2 个表,但它会从两个表返回数据,即使列的值没有出现在两个表中。

查询的基本语法是:

select 
  bln = coalesce(t1.bln, t2.bln),
  thn = coalesce(t1.thn, t2.thn),
  qty1 = isnull(t1.qty1, 0),
  qty2 = isnull(t2.qty2, 0)
from table1 t1
full join table2 t2
  on t1.bln = t2.bln
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo。这将产生以下结果:

| BLN |  THN | QTY1 | QTY2 |
|-----|------|------|------|
|   1 | 2014 |   10 |    0 |
|   1 | 2014 |   20 |    0 |
|   2 | 2014 |   30 |  100 |
|   ....
|   5 | 2014 |    0 |  400 |
|   6 | 2014 |    0 |  600 |
Run Code Online (Sandbox Code Playgroud)

您会注意到我COALESCE在列上使用了 abln并且thn- 这将返回这些列中的第一个非空值。然后我IsNullqty1, 和qty2列上null使用零替换为这些列返回的值。您可以使用COALESCEISNULL用于这些操作 - 我将两者都用于演示目的。

现在,由于您想要获得qty1qty2列的总和,您将添加带有 group by 的聚合函数。我实际上会在每个表的子查询中执行此操作,否则您可以获得每个数量的增加的总数。

select 
  bln = coalesce(t1.bln, t2.bln),
  thn = coalesce(t1.thn, t2.thn),
  qty1 = isnull(t1.qty1, 0),
  qty2 = isnull(t2.qty2, 0)
from
(
  select bln, thn, qty1 = sum(qty1)
  from table1
  group by bln, thn
) t1
full join
(
  select bln, thn, qty2 = sum(qty2)
  from table2
  group by bln, thn
) t2
  on t1.bln = t2.bln
Run Code Online (Sandbox Code Playgroud)

请参阅SQL Fiddle with Demo。这给出了结果:

| BLN |  THN | QTY1 | QTY2 |
|-----|------|------|------|
|   1 | 2014 |   30 |    0 |
|   2 | 2014 |   80 |  600 |
|   3 | 2014 |   40 |  200 |
|   4 | 2014 |   60 |  300 |
|   5 | 2014 |    0 |  400 |
|   6 | 2014 |    0 |  600 |
Run Code Online (Sandbox Code Playgroud)

最后,您只需使用查询来创建视图:

create view dbo.your_view as
select 
  bln = coalesce(t1.bln, t2.bln),
  thn = coalesce(t1.thn, t2.thn),
  qty1 = isnull(t1.qty1, 0),
  qty2 = isnull(t2.qty2, 0)
from
(
  select bln, thn, qty1 = sum(qty1)
  from table1
  group by bln, thn
) t1
full join
(
  select bln, thn, qty2 = sum(qty2)
  from table2
  group by bln, thn
) t2
  on t1.bln = t2.bln
Run Code Online (Sandbox Code Playgroud)

演示