Visual FoxPro中的Select查询(三)

子查询与连接异同

用 SQL Select 生成视图

可以用 SQL SELECT 语句直接生成视图:
语法如下:
CREATE SQL VIEW “VIEWNAME” AS SELECT …
    其中的 SELECT 子句可以是任何合法的SQL SELECT 语句,但是要注意,用代码方式书写的视图如果在代码中含有子查询、合并时,该视图不能在视图设计器中打开,即不能以可视的方式修改该视图。这会给系统的维护带来一定的困难(尤其在维护是由非开发人员进行时)。
因此在可以用子查询,也可以用外连接时应尽可能用外连接来书写创建视图的命令,如下所示:
子查询:
CREATE SQL VIEW “未外借图书请册” AS SELECT ;
    分类,;
    编号,;
    图书名称,;
    单价,;
    出版日期,;
    编制单位,;
    册数,;
    归档时间,;
    存放位置 ;
    FROM 图书类 ;
    GROUP BY 编号,图书名称 ;
WHERE 图书编码 NOT IN (SELECT 图书编码 FROM 图书借阅登记库 WHERE !归还否)
外连接:
CREATE SQL VIEW “未外借图书请册” AS SELECT ;
    分类,;
    编号,;
    图书名称,;
    单价,;
    出版日期,;
    编制单位,;
    册数,;
    归档时间,;
    存放位置 ;
    FROM 图书类 LEFT JOIN 图书借阅登记库 ;
    ON 图书类.图书编码=图书借阅登记库.图书编码 ;
HAVING 图书借阅登记库.归还否=.T. OR (ISNULL(图书借阅登记库.归还否))
    在上例中,虽然两个查询的结果是一样的,但是第一个查询生成的视图不能在视图设计器中打开而第二个查询生成的视图可以在视图设计器中打开,因此建议使用第二种书写格式。

注意事项

使用 SQL SELECT 命令时,应注意以下问题:
1 当表连接时。SQL 匹配空记录,建立一个小的卡氏积。应该认识到这一点 并用EMPTY()或表达式 “字段<>SPACE(LEN(字段)) 来保证空记录不出现在结果中。
2 SQL 遵从 SELECTED 的设置,若 DELETED 设置为 ON ,SQL 不处理任何已删除的记录。然而,若DELETED 设置为 OFF(默认情况),SQL 会把已删除的记录拿来处理。

结束语

SQL SELECT 命令一直都在改进,FoxPro 程序员可以用它来编写报表,进行查询和统计,生成视图等。以前要求用 SET RELATION,SCAN FOR 。SEEK 和SKIP 命令来处理记录,而现在只需要一条命令来实现这些命令的功能。在开发应用程序时加入 SQL SELECT 语句,可以减少开发时间,同时可以提高应用程序性能。
从另一方面讲,在进行系统设计时,如果充分掌握了 SQL SELECT,可以在建立数据模型时创建出系统所需的全部查询的视图,而不必在编程时花过多的精力来考虑数据的统计和查询,也可以极大地提高编程效率。同时使用SQL SELECT语句以编程的方式创建视图有利于系统的重建和维护。
在本文中,外连接和 TOP 子句仅可用于 VFP 5.0 及更高版本, 用 SQL SELECT 语句生成视图仅能用于 VFP 3.0 及以上版本,其它均可用于 FoxPro For Windows 2.5 及以上版本,特此说明.
最后说明一点: VFP 目前还不支持象 C 语言那样的,在用续行符连起来的各行上对程序进行逐行注释.象下面所示:
select company from customer ;
    where not exists ;
      (select * ;     &&用exists这里一定要用星号“*”
         from invoices where invoices.cno=customer.cno)
  但是为了便于理解程序,在本文中的有些地方,采用了这种类似 C 语言的注释方式。在实际编程中,运行这样的代码会造成一个错误。因此如果要运行本文中的示例程序,请注意示例中是否有这样的注释,如果有,简单的删除它们。
 » 本站地址:http://www.gomoth.com

标签: