欢迎来到天天文库
浏览记录
ID:5772304
大小:1.40 MB
页数:15页
时间:2017-12-24
《universe 联接问题》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、Universe3大陷阱环路定义:环路指经过模式中一组表的闭合联接,联接形成维表之间多条路径时将出现环路结果:返回太少行例:如下图的universe中存在一个环路,环路中本应该包含两个上下文,需要描述的均是顾客与服务之间的关系,但是由于服务有已消费和已预约两种,所以两个上下文在业务上分别表示预约顾客和服务间的关系和已消费顾客和服务之间的关系。由于此universe未设置任何上下文,导致出现环路错误。在universe中创建3个对象,分别为:顾客姓名,服务,预约天数。以下为在webi报表开发时,将以上3个对象均放入query中时生成的SQL,由于没有未环路指定不同上下文,整个环路被当做
2、一个上下文,在SQL的where子句中会出现环路中所有表的关联限制。实际上我们只需要对SQL进行其中一个上下文的限制。联接应用了比预期更多的限制,导致返回的结果是既预约了又消费了的用户,导致返回的数据不正确。解决方法:1.别名1.定义上下文别名有时候并不能解决所有环路的问题,或者有些环路问题需要定义不止一个别名来解决,如下图:为customer表定义别名后,发现city表仍然造成环路。此时需要定义上下文解决环路。指定上下文后,query会自动按相关的上下文生成SQL,此时where子句中的关联限制来自同一上下文的表之间的联接。断层陷阱定义:断层陷阱是当两个“多对一”联接会聚在一个表上
3、时三个表之间的一种联接路径,并且没有适当地分隔会聚联接路径的上下文。需要注意的是:基于以下即将描述的原因,联接的基数必须是“多对一”是才会产生断层陷阱。结果:返回数据变大例:universe中两张事实表invoice_line和reservation_line分别描述消费信息和预订信息,均与service表多对一关联。此时Universe中未指定任何上下文。为universe创建如下五个对象:将所有对象放入query中,此时query生成的SQL如下图:在webi报表上将下图所示3个字段拖入报表中,显示的数据如下:通过在数据库端验证,此数据是错误数据。错误原因如下图所示:之前的que
4、ry的SQL截图中where语句中内容决定了结果会产生笛卡尔积。由上图可知,为何必须是多对一关联才会出现断层陷阱问题。解决方法:指定上下文扇形陷进当“一对多”连接链接了依次由另一个“一对多”连接链接的表时,扇形陷阱是三个表之间的一种连接路径。当查询包括同时基于两个表的对象时,“一对多”连接的分散影响可能会导致返回不正确的结果。结果:返回的值变大。例:假设下图为以上涉及的3表中的相关数据:以下图为报表中含有的字段,分两种情况:1、query中不含SALE_MODEL中的字段model_id,此时结果是正确的:具体原因如下图:Query中不含model_id时,在query返回的结果集中
5、,sale_QTY会根据sale_id自动汇总,汇总数据是正确的。2、query中含SALE_MODEL中的字段model_id,此时结果是不正确的:具体原因如下图:此时返回的结果集如上图所示,由于model_id各不相同,SALE表中的数据复制后与SALE_MODEL表数据关联,图中红线框内即为复制后重复的数据,所以导致salevalue的数据汇总后是错误的。解决方法:定义别名并指定上下文合并维:结论:一个包含在合并维中的维度A,和同它不在同一query的度量处于同一报表块时,如果合并维中存在与此度量处于同一query的维度B,维度A会自动与此度量产生关联,效果等同于与此度量属于同
6、一query。Query1:Query2:场景一:不合并维结果:1、维度:[Query1].[Lines],[newmeasure]2、维度:[Query2].[Lines],[newmeasure]场景二:合并维结果:1、维度:[Query1].[Lines],[newmeasure]2、维度:[Query2].[Lines],[newmeasure]
此文档下载收益归作者所有