⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 postgresql-howto-23.html

📁 Linux初学者最好的老师就是howto了。相当于函数man。
💻 HTML
📖 第 1 页 / 共 4 页
字号:
<BLOCKQUOTE><CODE><PRE>        UPDATE Temp T1        SET (T1.Stop) = (SELECT MAX(T2.Stop)                         FROM Temp AS T2                         WHERE T1.Salary = T2.Salary AND T1.Start &lt; T2.Start                                AND T1.Stop >= T2.Start AND T1.Stop &lt; T2.Stop)        WHERE EXISTS (SELECT *                      FROM Temp AS T2                      WHERE T1.Salary = T2.Salary AND T1.Start &lt; T2.Start                                AND T1.Stop >= T2.Start AND T1.Stop &lt; T2.Stop)        until no rows updated;DELETE FROM Temp T1WHERE EXISTS (SELECT *              FROM Temp AS T2              WHERE T1.Salary = T2.Salary                        AND ((T1.Start > T2.Start AND T1.Stop &lt;= T2.Stop)                        OR (T1.Start >= T2.Start AND T1.Stop &lt; T2.Stop))</PRE></CODE></BLOCKQUOTE>回圈中找出重叠或相邻而需要合并的时段。在最坏的情况,回圈会执行 log N 次,N 指一连串重叠或相邻的同薪金纪录的数量。读者可自行模拟查询在以上例子的执行来验证它的正确性。<P>第三种方法是使用 SQL 为表格开启一个游标 (cursor)。为每个薪金管理一个各段落的链表 (linked list)。这链表开始时需为空白。<BLOCKQUOTE><CODE><PRE>DECLARE emp_cursor CURSOR FOR        SELECT Salary, Title, Start, Stop        FROM Employee;OPEN emp_cursor;loop:        FETCH emp_cursor INTO :salary, :start, :stop;        if no-data returned then goto finished;        find position in linked list to insert this information;        goto loop;finished:CLOSE emp_cursor;</PRE></CODE></BLOCKQUOTE>重覆至链表结束,印出日期和薪金。<P>如果游标是 ORDER BY Start,链表并非必要。<P>无论如何,一句简单的查询是不易用 SQL-92 的功能表达出这目的。使用 TSQL2 的话这查询会很简单。<BLOCKQUOTE><CODE><PRE>        SELECT Salary        FROM Employee</PRE></CODE></BLOCKQUOTE><H3>案例研究□连结 (JOIN)</H3><P>一个更激进的方法是把纲目重整,把薪金、职级、出生日期资料分开,从而避开抽取薪酬历史时遇到的问题。(为方便计,我们以後的讨论中不再考虑出生日期。)<BLOCKQUOTE><CODE><PRE>        Employee1 (Name, Salary, Start DATE, Stop DATE)        Employee2 (Name, Title, Start DATE, Stop DATE)</PRE></CODE></BLOCKQUOTE>Employee1 表格如下∶<BLOCKQUOTE><CODE><PRE>Name    Salary  Start           Stop----    ------  -----           ----Bob     60000   1993-01-01      1993-05-30Bob     70000   1993-06-01      1993-12-31</PRE></CODE></BLOCKQUOTE>这是 Employee2 表格。<BLOCKQUOTE><CODE><PRE>Name    Title                   Start           Stop----    ------                  -----           ----Bob     Assistant Provost       1993-01-01      1993-09-30Bob     Provost                 1993-10-01      1994-01-31Bob     Professor               1994-02-01      1994-12-31</PRE></CODE></BLOCKQUOTE><P>改变之後,取得雇员薪金资料变得简单。<BLOCKQUOTE><CODE><PRE>        SELECT Salary, Start, Stop        FROM Employee1        WHERE Name = 'Bob'</PRE></CODE></BLOCKQUOTE>但如果 OAP 想一个表格中包括薪金、职位的时段(即 OAP 想一个像图 1 形式的表格)?一个方法是印出两个表格,而让用者找出有关组合。另一方法是完全使用 SQL。不幸地,这查询要分析 Employee1 每行和 Employee2 的重叠情况,有四种可能出现。<BLOCKQUOTE><CODE><PRE>SELECT Employee1.Name, Salary, Dept, Employee1.Start, Employee1.StopFROM Employee1, Employee2WHERE Employee1.Name = Employee2.Name     AND Employee2.Start &lt;= Employee1.Start AND Employee1.Stop &lt; Employee2.StopUNIONSELECT Employee1.Name, Salary, Dept, Employee1.Start, Employee2.StopFROM Employee1, Employee2WHERE Employee1.Name = Employee2.Name     AND Employee1.Start >= Employee2.Start AND Employee2.Stop &lt; Employee1.Stop        AND Employee1.Start &lt; Employee2.StopUNIONSELECT Employee1.Name, Salary, Dept, Employee2.Start, Employee1.StopFROM Employee1, Employee2WHERE Employee1.Name = Employee2.Name     AND Employee2.Start > Employee1.Start AND Employee1.Stop &lt; Employee2.Stop        AND Employee2.Start &lt; Employee1.StopUNIONSELECT Employee1.Name, Salary, Dept, Employee2.Start, Employee2.StopFROM Employee1, Employee2WHERE Employee1.Name = Employee2.Name     AND Employee2.Start > Employee1.Start AND Employee2.Stop &lt; Employee1.Stop</PRE></CODE></BLOCKQUOTE>正确找出所有情形是一件具挑战性的工作。使用 TSQL2,进行一个具时态的连结就如人们所期望。<BLOCKQUOTE><CODE><PRE>        SELECT Employee1.Name, Salary, Dept        FROM Employee1, Employee2        WHERE Employee1.Name = Employee2.Name</PRE></CODE></BLOCKQUOTE><H3>个案研究□聚集 (AGGREGATES)</H3><P>现在 OAP 被问及最高薪酬是什么?加上时间前,这很简单。<BLOCKQUOTE><CODE><PRE>        SELECT MAX(Salary)        FROM Employee</PRE></CODE></BLOCKQUOTE>现在加上了薪金历史,我们要找出不同时间最高薪金的历史。问题当然是 SQL 并不提供具时态的聚集。简单的方法是印出有关资料,用人手找出最大值。另一个方法是取巧,把一个当时的 (snapshot) 聚集查询转化为不使用聚集的查询,再转化为时态聚集。那个不使用聚集的查询用于找出不大于它本身数值的薪金。<BLOCKQUOTE><CODE><PRE>        SELECT Salary        FROM Employee AS E1        WHERE NOT EXISTS (SELECT *                          FROM Employee AS E2                          WHERE E2.Salary > E1.Salary)</PRE></CODE></BLOCKQUOTE>把这个查询变为时态查询并不显浅。以下是一种方法。<BLOCKQUOTE><CODE><PRE>CREATE TABLE Temp (Salary, Start, Stop)AS      SELECT Salary, Start, Stop        FROM Employee;INSERT INTO Temp        SELECT T.Salary, T.Start, E.Start        FROM Temp AS T, Employee AS E        WHERE E.Start >= T.Start AND E.Start &lt; T.Stop AND E.Salary > T.Salary;INSERT INTO Temp        SELECT T.Salary, T.Stop, E.Stop        FROM Temp AS T, Employee AS E        WHERE E.Stop > T.Start AND E.Stop &lt;= T.Stop AND E.Salary > T.Salary;DELETE FROM Temp TWHERE EXISTS (SELECT *              FROM Employee AS E              WHERE ((T.Start => E.Start AND T.Start &lt; E.Stop)                        OR (E.Start >= T.Start AND E.Start &lt; T.Stop))                    AND E.Salary > T.Salary;</PRE></CODE></BLOCKQUOTE>这方法建立辅助表格。我们在这个表格中加上两个时段中重叠部分的上、下部分。之後我们把所有子查询中找出的纪录删除,因此影响到 NOT EXISTS。最後我们从辅助表格中找出最长的时段,像之前我们找出薪金信息般。如大家所料,这样的 SQL 句子执行时效率非常低,因为那些复杂的巢状不等查询。<P>第三个方法是尽量少用 SQL,而在主机上所用的语言中用游标找出最长的历史。<P>使用 TSQL2 再次简单直接。<BLOCKQUOTE><CODE><PRE>        SELECT MAX(Salary)        FROM Employee</PRE></CODE></BLOCKQUOTE><H3>摘要</H3><P>大部分资料库应用程序都需要处理随时间改变的资料。有效时间在 SQL 并不支持。很多时态查询不是很以 SQL 模拟,就是需要把 SQL 嵌入到程序语言中,因为 SQL 在资料模型和查询语言结构中缺乏对有效时间的支持。<P>另一方面,我们示□出加上有效时间支持需要对 DBMS 施行作出一些改变,但能戏剧性地简单一些查询,并使其他查询变得有可能。将来也可于储存结构、索引方法的最佳化 (optimization)。而最佳化的策略可导致表现大幅提升。<P>随著 SQL3 的一个新部分支持随时间改变的资料,我们可以开□处理这类应用,改良 SQL3处理时态资料的能力。<BLOCKQUOTE><CODE><PRE>----------------------------------------------------------------------------           Accredited Standards Committee* X3, Information TechnologyNEWS RELEASE文件编号∶       PR/96-0002回覆∶       Barbara Bennett at bbennett@itic.nw.dc.us             X3 宣布认可一个这专案, ISO/IEC 9075 Part 7:  SQL/TemporalWashington D.C., 1996 年一月----------------------------------------------------------------------------</PRE></CODE></BLOCKQUOTE>-- Accredited Standards Committee X3, Information Technology 宣布认可一个有关 SQL/Temporal 支持的新专案,ISO/IEC 9075 Part 7,并把有关工作交予 Technical Committee X3H2, Database。这个建议中的标准订明将出现的 SQL3 标准的一个新部分,如第七部分 Temporal SQL为 SQL 的一个延伸,在 SQL 资料库环境支持存取和处理具时态的资料。下次 X3H2 会议定于一九九六年三月十一至十四日在堪萨斯 (Kansas) 举行。<P>如有查询,可邮寄往∶<BLOCKQUOTE><CODE><PRE>        Chairman of X3H2,        Dr. Donald R. Deutsch,        Sybase, Inc., Suite 800,        6550 Rock Spring        Drive, Bethesda, MD  20817.        Email: deutsch@sybase.com.</PRE></CODE></BLOCKQUOTE>现正寻求可能的专利和其他恰当的事项(版权、商标)。这把有关资料寄交∶<BLOCKQUOTE><CODE><PRE>        X3 Secretariat at        1250 Eye Street        NW, Suite 200,        Washington DC  20005.        Email: x3sec@itic.nw.dc.us        FAX:  (202)638-4922.</PRE></CODE></BLOCKQUOTE><H2><A NAME="ss23.17">23.17 第八部分□ISO/ANSI SQL MULTIMEDIA (SQL/MM)</A></H2><P>一个为建立用于多媒体应用程序的 SQL 物件函式库的新 ISO/IEC 国际标准化计划在一九九三年初期获批准进行。这个新标准化行动名为 SQL Multimedia (SQL/MM),它会用草拟中的 SQL3 规格中的抽象资料型态(ADT)规格和目标指定 SQL ADT 定义套装。SQL/MM 目标为标准化科学和工程、全文和文件处理、管理多媒体物件,如影像、声音、动画、音乐和录像的物件函数库。它多数会提出一种用于其他 JTC1 标准组织(如有关文件的 SC18、影像的 SC24、照片和动作图像的 SC29)定义的物件的 SQL 语言结合 (binding)。<P>SQL/MM 的专案计划指出它会成为一份多部分标准,包含不定数量的部分。第一部分会是其他部分如何建成的框架。其他每个部分会专注于一个特定的 SQL 应用程序套件。以下为一九九四年八月存在的 SQL/MM 部分∶<P><UL><LI>   Part 1: Framework A non-technical description of how the document isstructured.</LI><LI>   Part 2: Full Text Methods and ADTs for text data processing. About 45pages.</LI><LI>   Part 3: Spatial Methods and ADTs for spatial data management. About 200pages with active contributions from Spatial Data experts from 3national bodies.</LI><LI>   Part 4: General Purpose Methods and ADTs for complex numbers,Facilities include trig and exponential functions, vectors, sets, etc.Currently about 90 pages.</LI></UL><P>有多个有关空间和地理资料的标准化的工作在进行中∶<P><UL><LI>   ANSI X3L1 - Geographic Information Systems.Unisys 的 Mark Ashworth of Unisys 是 X3L1 和 ANSI X3H2 间的联络人。他也是 SQL/MM 草稿第一、三和四部分的编辑。</LI><LI>   ISO TC 211 - Geographic information/Geomatics</LI></UL><HR><A HREF="PostgreSQL-HOWTO-24.html" tppabs="http://www.linux.org.tw/CLDP/gb/PostgreSQL-HOWTO-24.html"><IMG SRC="next.gif" tppabs="http://www.linux.org.tw/CLDP/gb/img/next.gif" ALT="Next"></A><A HREF="PostgreSQL-HOWTO-22.html" tppabs="http://www.linux.org.tw/CLDP/gb/PostgreSQL-HOWTO-22.html"><IMG SRC="prev.gif" tppabs="http://www.linux.org.tw/CLDP/gb/img/prev.gif" ALT="Previous"></A><A HREF="PostgreSQL-HOWTO.html#toc23" tppabs="http://www.linux.org.tw/CLDP/gb/PostgreSQL-HOWTO.html#toc23"><IMG SRC="toc.gif" tppabs="http://www.linux.org.tw/CLDP/gb/img/toc.gif" ALT="Contents"></A>  </BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -