事实表中填充了太多记录

时间:2015-12-30 19:23:28

标签: oracle

我的事实表中有62000条记录是不正确的,因为我的时间里只有6条记录,我的学生昏暗的240条记录和我的位置昏暗的140条记录,是否与我的where子句有关任何帮助都将受到赞赏。

INSERT INTO fact_placements (
    report_id,
    no_of_placements,
    no_of_students,
    fk1_time_id,
    fk2_placement_id,
    fk3_student_id )
SELECT
    fact_seq.nextval,
    no_of_placements,
    no_of_students,
    time_id,
    placement_id,
    student_id
FROM
    time_dim,
    placement_dim,
    student_dim 
WHERE
    placement_dim.year = time_dim.year AND
    student_dim.year = time_dim.year; 

2 个答案:

答案 0 :(得分:0)

除非您进行笛卡尔加入,即没有任何WHERE子句,否则您将得到少于140(位置)* 240(学生)* 6(时间)= 201600事实记录。您当前的SQL使用3个表中的年份列来加入,这会将记录过滤到您获得的62000。

你的问题标题说即使这个“太多了”。如果是这种情况,那么在根据任何标准加入这些维度之前,您需要了解维度的粒度和事实。这些都是“年”级别,如果是这样,每个表中每年有1条记录,而且没有基于年份的重复记录吗?

如果没有,您可能需要重新考虑事实表的粒度,或者需要根据每个维度中的年份加入唯一记录,以获得您期望的实际(较少)记录数,这也可以完成通过根据年份总结这些表格。

理想情况下,事实表包含维度键与附加列的组合,即事实度量(在本例中为no_of_placements和no_of_students)。但是根据可用数据,事实表中不会出现所有组合。

另外,您可能希望使用FROM子句中的表名之间的逗号来更改SQL语法以使用INNER JOIN子句而不是隐含连接,如下所示

 FROM time_dim
INNER 
 JOIN placement_dim
   ON placement_dim.year = time_dim.year
INNER 
 JOIN student_dim 
   ON placement_dim.year = student_dim.year

答案 1 :(得分:0)

就业与学生之间没有任何关系,这就是为什么你有这么多记录。

您的查询是:向我提供所有学生和年份相同的所有展示位置。

我不确定你想要的是什么。这里真正奇怪的是你正在加载一个带维度表的事实表。