我有两个表,如Parent-Child。在Parent表中,有7211条记录。在Child,有169498条记录。在这两个表之间没有关系(手段没有设置外键,但使用parentID)。在Child表中,有额外的记录和缺失的记录。
作为样本,
Parent Table - tblParent
PID PName
A001 John
B002 Mary
... ...
Child Table - tblChild
PID TID Desc
A001 056 Book
Y004 087 Pen
... ... ...
我的查询如下,
SELECT PID
FROM tblParent
WHERE PID NOT IN
(
SELECT PID
FROM tblChild
)
以实际号码运行它。记录,MS Access 2000突然停止。如果我用10条记录测试它,它可以正常工作。主要原因是什么?没有记录?
我尝试另一种方式。
SELECT C.PID, P.PID
FROM tblChild C, tblParent P
WHERE C.PID <> P.PID
此时,结果会成倍增加。 (我的意思是一个带有所有P.PID的C.PID然后等......)
如何在Access 2000中的最短执行时间内获取额外和丢失的记录?
答案 0 :(得分:1)
首先,您在PID列上有索引吗?它应该是tblParent中的主键和tblChild中的非唯一索引。设置外键关系会为你创建这些索引(我相信)。
您可以减少需要匹配的记录数。如果你要运行这个SQL:
SELECT DISTINCT PID
FROM tblChild
WHERE PID IN (
SELECT PID
FROM tblParent
)
您只能获得应该在tblParent表中的父PID。然后把它组合起来像
SELECT PID
FROM tblParent
WHERE PID NOT IN
(
SELECT DISTINCT PID
FROM tblChild
WHERE PID IN (
SELECT PID
FROM tblParent
)
)
应该有助于加快查询速度,找到所有没有孩子的父母。
要查找额外的儿童记录,您可以
SELECT DISTINCT PID
FROM tblChild
WHERE PID NOT IN (
SELECT PID
FROM tblParent
)
不幸的是,我没有Access来测试它。我希望它有所帮助
答案 1 :(得分:0)
这是因为您在子查询中选择了169 498条记录:
SELECT PID
FROM tblChild
这是很多。整个tblChild表可能被扫描,从磁盘读取,PID列被分离并存储在内存中的所有位置,所有169 498值。然后,您读取所有7211记录并检查每个记录是否不在169 498大小的子PID数据集中。这对Access来说很重要。