我的事实表中有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;
答案 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)
就业与学生之间没有任何关系,这就是为什么你有这么多记录。
您的查询是:向我提供所有学生和年份相同的所有展示位置。
我不确定你想要的是什么。这里真正奇怪的是你正在加载一个带维度表的事实表。