SQL、日历和主键

SQL, Calendar and Primary key

我目前陷入了一个 SQL 相关问题,希望能得到你们的帮助。 这是我的问题: 我有一个事实 table,DATE 列,B 和 C 是键,VALUE 是事实值。 我还有一个参考日历 table。 我想要的是,对于每个现有的元组 B-C,以及我日历的每个日期(即使这个日期没有事实,也检索一行。

例如,假设我有:

Calendar (DD-MM-YYYY)
01-01-2015
02-01-2015
03-01-2015

和事实

Date       | B  | C  | VALUE
=============================
02-01-2015 | aa | xx | 10
02-01-2015 | aa | yy | 15
03-01-2015 | aa | xx | 10

我要:

01-01-2015 | aa | xx | 0
01-01-2015 | aa | yy | 0
02-01-2015 | aa | xx | 10
02-01-2015 | aa | yy | 15
03-01-2015 | aa | xx | 10
03-01-2015 | aa | yy | 0

我怎样才能有效地做到这一点?

在此先感谢您提供的任何帮助。

首先在 FACT table

中创建具有 BC 列唯一值的笛卡尔积 calendar 日期

然后 Outer join`` the result of first step withfact` table 得到结果

尝试这样的事情

;WITH cte 
     AS (SELECT Ca.dates, C, B
         FROM   (SELECT DISTINCT C, B 
                 FROM   fact) A 
                CROSS JOIN calendar Ca) 
SELECT A.dates, 
       A.B, 
       A.C, 
       Isnull(F.value,0) as value
FROM   cte A 
       LEFT OUTER JOIN fact F 
                    ON A.dates = f.dates 
                       AND A.C = F.C 
                       AND A.B = F.B