2024年5月30日发(作者:)

 第

21

卷第

12

  

2000

12

文章编号

:1000

2

1220

(

2000

)

2

12

2

1330

2

03

小型微型计算机系统

MINI

-

MICROSYSTEM

Vol

1

21

No

1

12

 

 

Dec

.2000

  

VFP

6.0

中基于三表查询时联接条件中的问题及解决措施

曲维光

(

南京师范大学数学与计算机科学学院 南京

210097

)

摘 要

:

本文对

VisualFoxPro

6.0

中基于三表查询时联接条件中存在的问题进行了讨论

,

找出造成问题的原因

,

并对

如何避免问题的产生给出了解决措施

.

关键词

:

VisualFoxPro

6.0;

查询

;

永久性关系

;

联接条件

分类号

:

TP

311

     文献标识码

:

A

1

 引 言

VisualFoxPro

6.0

(

简称

VFP

)

Microsoft

公司开发的

VisualStudio

套件最新版本中的一员

,

它既吸收了

Visual

列产品的优点

,

具有功能强大、操作简便、可视性强、面向对象

等特点

,

又兼有

Windows

和原

FoxPro

的长处

.

该产品在世界

各地

,

特别是在中国

,

得到广泛应用

.

但在软件开发设计时

,

我们发现

,

在进行多表查询过程

,

对多表间联接条件进行设定时

,

该软件仍有许多明显不足

之处

.

利用该软件进行两表间查询

,

结果是满意的

,

但在进行三

表及以上查询时

,

可能出现错误

.

由于基于三表的查询

,

是日常软件开发及教学工作中经

常使用的方式

,

并且三表查询构成多表查询的基础

,

以下仅对

三表查询进行讨论

.

对于

0

型联接表

,

三表以任何顺序添加到查询中

,

均可正

常执行

.

对于

1

型联接表

,

三表添加入查询的顺序决定了查询的

成败

.

在将三表以

B

C

A

C

B

A

的顺序添加后

,

当形

成查询文件存盘时

,

就会出现错误

.

对于

2

型联接表

,

三表以任何顺序添加

,

都会出现与

1

联接表类似的错误

.

1

2

 问题的提出

在创建多表查询时

,

一个重要步骤便是建立诸表之间的

联接条件

.

当向查询中添加多个表时

,

如果新添加的表与已加入查

询中的表之间在数据库中已经建立起永久性关系

,

则系统将

以该永久性关系作为默认的联接条件

;

否则

,

系统会打开“联

接条件”对话框

,

并以两个表间同名字段作为默认的联接条

.

如果所有的表中都没有同名字段

,

则对话框中的联接条件

为空白

.

此时

,

可以创建其它的联接条件

.

如果按“取消”按钮

,

则不建立任何联接

.

对于相互具有永久性关系的三表

,

在实际应用中较常用

的拓扑结构有图

1

所示的三种

(

对于多对多的关系

,

我们可以

通过引入“纽带表“

,

将其转换为两个一对多关系

.

)

.

其中连线

代表两表之间具有永久性关系

.

箭头代表主从关系

(

从主关键

字指向外部关键字

)

.

按照中间表出度值

,

将三种类型命名为

:0

型联接表、

1

联接表和

2

型联接表

.

由于在查询文件存盘之前

,

包括出错情况在内

,

都已形成

一个查询语句

,

并且可执行出结果

.

而出错情况执行的结果可

能是错误的

.

如果用户

(

特别是非专业用户

)

不加检查而将错

误的信息加以使用

,

将可能产生灾难性后果

.

这些问题

,

对于

以可视化编程著称的

VFP

来说

,

无疑是失败之处

.

3

 示例

为了进一步揭示出现问题的原因

,

进行如下试验

.

(

为了

简便

,

我们将每个字段都设定为

3

字节字符型

.

)

1

型表联接

:

选择表结构及数据分别如图

2

、图

3

中前三

.

将三表以

Tablea

Tableb

Tablec

Tableb

Tablea

Tablec

Tablea

Tablec

Tableb

Tablec

Tablea

Tableb

四种顺序加入查询

,

形成的

SQL

语句为

:

SELECT

3

;

FROMqwg

!

tableaINNERJOINqwg

!

tableb

;

INNERJOINqwg!tablec

;

.

c2

;

ONTableb

.

b1

=

Tablec

ONTablea

.

a1

=

Tableb

.

b2

  收稿日期

:2000

2

03

2

07

 基金项目

:

南京师范大学理科青年科学基金资助 作者简介

:

曲维光

,

硕士

,

讲师

,

研究方向为网络数据库和人工智

.

© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.

12

期       曲维光

:

VFP

6.0

中基于三表查询时联接条件中的问题及解决措施  

1331

2

3

  运行结果为图

4,

正确

.

对于其余的两种情况

Tableb

Tablec

Tablea

Tablec

Tableb

Tablea

形成的

SQL

语句

:

SELECT

3

;

FROMqwg!tablebINNERJOINqwg!tablec;

INNERJOINqwg

!

tablea

;

ONTablea

.

a

1=

Tableb

.

b

2;

.

c

2

ONTableb

.

b

1=

Tablec

上述情况执行的结果如图

5,

错误

.

在需要将其查询进行

存储时

,

便出现一个对话框

,

提示错误信息

:

SQL

:

Column

(

B

2

’列没有找到

)

.

’B

2

’isnotfound

5

为了说明问题

,

再进行如下实验

:

将图

2

和图

3

所示的表

依次从左到右添入查询

,

形成的

SQL

语句为

:

SELECT

3

;

FROMqwg

!

tableaINNERJOINqwg

!

tableb

;

INNERJOINqwg

!

tablec

;

INNERJOINqwg

!

tabled

;

INNERJOINqwg

!

tablee

;

.

ONTabledd

1=

Tablee

.

e

2;

.

c

1=

Tabled

.

d

2;

ONTablec

.

c

2;

ONTableb

.

b

1=

Tablec

ONTablea

.

a

1=

Tableb

.

b

2

4

0

型表联接

:

在三表中选择

A

,

C

两表具有不同的主索

,

并分别指向

B

表中的两个普通索引

(

即建立起永久性关

)

.

则三表无论以何种顺序添加入查询

,

都会得到正确结果

(

可能字段排列有所差别

)

.

2

型表联接

:

选择

B

表具有主索引

,

并分别指向

A

,

C

结果是正确的

.

4

 分析

通过上述示例

,

我们发现

:

1.

VFP

按照添入表的顺序

,

将永久性关系作为默认联接

条件

,

并且首先按照主表

(

含有主关键字的表

)

、副表

(

含有外

表的普通索引

,

建立起永久性关系

.

仔细设计表记录

,

会发现

,

三表无论以何种顺序添加入查询

,

形成的

SQL

语句运行结果

都不正确

.

当将其查询进行存储时

,

便会出现和

1

型表联接类

似的错误信息

.

部关键字的表

)

的顺序进行连接

.

2.

此时

,

若再有永久性关系

,

则按顺序连接在原有联接

之后

.

3.

再添入表时

,

按顺序寻找永久性关系

,

如有

,

则将该表

连接在原有联接之后

.

© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.

13

         

32

小 型 微 型 计 算 机 系 统       

2000

4.

SELECT

语句中

FROM

后面的用

INNERJOIN

连接

的各表

,

依次从左到右两两选择

,

并与后面的

ON

条件从下到

(

或从右到左

)

,

一一匹配

,

进行操作

,

以完成一个联接

.

ON

条件中的某字段与

INNERJOIN

中相应两表不符时

,

便

会出现错误提示

,

从而实现不了查询的正确生成

.

5.

VFP

可以很好地实现表间具有线性永久性关系

(

即除

头表和尾表外

,

其余表的永久性关系连线的入度与出度皆为

1

的表列

)

的多表间查询的自动生成

.

由此可见

:

1.

VFP

试图将客观世界中广泛存在的关系

,

以一种线性

的方式加以描述

,

它只能描述那些具有线性永久关系的表列

,

具有局限性

.

2.

在将永久性关系作为默认联接条件加入查询时

,

又将

主从关系过分强调

.

实际上

,

两表的联接操作

,

是具有交换律

1,2

.

(

AINNERJOINB

)

condition

=

(

BINNERJOINA

)

condition

上述两点正是该功能的缺陷

,

也是导致以上错误的原因

.

的方法是

,

将默认的联接条件去掉

,

在查询设计器内手动加入

联接

.

方向可与

0

型或

1

型方向相同

.

因为在查询设计器中加

入联接条件时

,

不需要按照主从关系联接

.

这里最主要的是

,

要保证首次进行手动联接时

,

将指针引入中间表

(

即图

1

B

)

.

这种情况下

,

相互关联的字段最好同名

,

以便于可视化进

行选取

.

  表

A

→表

B

 表

C

   表

A

 表

B

 表

C

6

对于永久性关系不完全的情况

,

如图

6

所示

,

我们可以根

据其表间内在联系

,

在数据库设计阶段将其永久性关系加上

,

便可参照图

1

三种情况

,

加以讨论和解决

.

6

 结束语

本文对

VFP

6.0

基于三表查询时联接条件中存在的问题

进行讨论

,

找出造成问题的原因

,

并对于如何避免问题的产

,

给出了解决措施

.

本文实验环境为

:

windows

98

VisualFoxPro

6.0

version

:06.00.8167.00

productID

:82898

2

374

2

5919515

2

27866

经过补丁程序

pack

3

修改

.

感谢

UNIONCOLLEGE

OCS

DianeKiller

女士为本题目的研究提供了极大的便

.

参 考 文 献

1

RamezElmasri

,

ShamkantB

.

NavatheFundamentalsofDatabase

Systems

(

ThirdEdition

)

M

Addison

2

Wesley

,1999

2

周志逵

.

数据库原理与技术

.

〔〕北京

.

科学出版社

.1998

M

5

 解决措施

对于一个功能庞大的软件中存在的问题

,

我们无法轻易

对其进行改造

,

但可在实际应用中总结经验

,

避免出现错误

.

对于上述三种表联接

,

分别采取如下措施

:

1.0

型表联接

,

无需任何限制

,

即可完成查询

.

2.1

型表联接

,

应该注意添加表的顺序

.

最简单的办法

,

根据永久性关系的方向依次添加各表

.

3.2

型表联接

,

无法利用永久性关系自动形成查询

.

解决

DISCUSSNIGANDSOLVNIGPROBLEMSNIJONICONDITIONSBASEDON

2

TABLEQUERYUSNMULTIIGVISUALFOXPRO

6.0

QU

 

Wei

2

guang

(

DepartmentofComputerSciences

,

NanjingNormalUniversity

 

Nanjing

210097

)

Abstract

 

TheProblemsofjoinconditionsofquerybasedonthreetablesinVisualFoxPro

6.0

programmingarediscussed

.

The

reasonscausingtheproblemsarefoundandmethodstoavoidtheproblemsinprogrammingareputforward

.

Keywords

 

VisualFoxPro

6.0;

Query

;

Persistentrelationship

;

Joincondition

© 1994-2010 China Academic Journal Electronic Publishing House. All rights reserved.