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.


发布评论