在2列上加入3个表?

时间:2015-05-04 23:17:57

标签: sql sql-server

我创建了3个相同列的视图 - 数量,年份和品种。我想在年份和品种上加入所有三个表格,以便对数量进行一些计算。

问题是每个视图都不会出现特定的年份/品种组合。

我尝试了类似的查询:

SELECT
    *
FROM
a
    left outer join
b
    on a.variety = b.variety
    left outer join
c
    on a.variety = c.variety or b.variety = c.variety
WHERE
    a.year = '2015'
    and b.year = '2015'
    and a.year= '2015'

显然这不是正确的解决方案。理想情况下,我想加入年份和品种,而不是使用where声明。

无论表格上的空值如何,所需的输出都会将所有匹配年份和品种的数量放在同一行上。

非常感谢帮助,谢谢。

1 个答案:

答案 0 :(得分:1)

你想要一个完整的外连接,而不是左连接,如下所示:

Select coalesce(a.year, b.year, c.year) as Year
  , coalesce(a.variety, b.variety, c.variety) as Variety
  , a.Quantity, b.Quantity, c.Quantity
from tableA a
full outer join tableB b
  on a.variety = b.variety 
  and a.year = b.year
full outer join tableC c
  on isnull(a.variety, b.variety) = c.variety
  and isnull(a.year, b.year) = c.year
where coalesce(a.year, b.year, c.year) = 2015

您正在使用的左连接不会从b或c中选取不在a中的值。此外,您的where子句正在删除所有三个表中没有值的行(因为这些行中的年份为null,不等于2015)。无论另一个表是否包含匹配项,完整外部联接将从联接中的任一表中获取行。