字体
第(4/6)页
关灯
   存书签 书架管理 返回目录
样具有对称xìng。通常,当需要查找和最小、最大、

    最早、或最近的值相关联的数据时,首先必须找到这些值本身(此为第一遍扫描,需比较记录),

    接下来的用这些值作为第二遍扫描的搜索条件。而以滑动窗口(sliding window)为基础的OLAP

    函数,可以将两遍扫描合而为一(至少表面上如此)。基于时间戳或日期的数据查询,非常特殊

    也非常重要,本章在稍后的“基于日期的简单搜索或范围搜索”中专门讨论。

    总结:当多个选取条件用于同一个表的不同记录时,可以使用基于滑动窗口工作的函数。

    基于一个表的自连接

    Self-Joins on One Table

    利用卓越的、广为流行的范式(注2),有助于我们设计正确的关系数据库(至少满足3NF)。所

    有非键字段均与键相关、并完整依赖于键,非键字段之间没有任何依赖。每条记录具有逻辑一

    致xìng,同一个表中没有重复记录。于是,才能够建立同一个表之间的连接关系:使用同一查询

    从同一表中选择不同记录的集合(可以相jiāo),然后连接它们,就好像它们来自不同表一样。本

    节将讨论简单的自连接。本节不讨论较复杂的嵌套层次结构,这一主题在第7章中讨论。

    自连接,指表与自身的连接,这种情况比分层查询更常见。自连接用于“从不同角度看

    待相同数据”的情况,例如,查询航班会两次用到airports 表,一次找到“出发机场”的名称,另

    一次找出“到达机场”的名称:

    select f.flight_number,

    a.airport_ncom departure_airport,

    b.airport_ncom arrival_airport

    from flights f,

    airports a,

    airports b

    where f.dep_iata_code = a.iata_code

    and f.arr_iata_code = b.iata_code

    此时,一般规则仍然适用:重点保证索引访问的高效。但是,如果此时索引访问不太高效怎么

    办呢?首当其冲地,应避免“第一轮处理丢弃了第二轮处理所需的记录”。应该通过一次处理收

    集所有感兴趣的记录,再使用诸如case 语句等结构分别显示记录,第11章将详细说明这种方法。

    非常微妙的是,有些情况看似与“机场的例子”很像,但其实不然。例如,如何利用一个保存“定

    期累计值”(注3)的表,显示每个时间段内累计值的增量?此时,该表内的两个不同记录间虽

    然有关联,但这种关联很弱:两个记录之所以相关,是因为它们的时间戳之间有前后关系。而

    连接两个flights表是通过airports表进行的,这种关联很强。

    例如,时间段为5分钟,时间戳以“距参照日期多少秒(seconds elapsed since a reference date)”

    表示,则查询如下:

    select a.tcomstamp,

    a.statistic_id,

    (b.counter - a.counter)/5 hits_per_minute

    from
上一页 目录 下一页