Access 2000 Время выполнения запроса - PullRequest
1 голос
/ 03 марта 2011

У меня есть две таблицы, такие как Parent-Child.В родительской таблице есть 7211 записей.В Child есть 169498 записей.Между этими двумя таблицами нет никакой связи (значит, не установлен внешний ключ, но используется parentID).В дочерней таблице есть дополнительные записи и пропущенные записи.

Как образец,

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

В это время получается результат умножения.(Я имею в виду один C.PID с ALL P.PID, а затем и т. Д.)

Как я могу получить лишние и недостающие записи в кратчайшие сроки выполнения в Access 2000?

Ответы [ 2 ]

1 голос
/ 03 марта 2011

Во-первых, у вас есть индекс для столбца PID? Это должен быть первичный ключ в tblParent и неуникальный индекс в tblChild. Установка отношения внешнего ключа создала бы эти индексы для вас (я полагаю).

Вы можете уменьшить количество записей, с которыми вам нужно соответствовать. Если вы должны запустить этот SQL:

SELECT DISTINCT PID
FROM tblChild
WHERE PID IN (
    SELECT PID
    FROM tblParent
)

Вы получите только родительские PID, которые должны быть в таблице tblParent. Тогда объединяя это как

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
)

К сожалению, у меня нет доступа, чтобы проверить это. Надеюсь, это поможет

0 голосов
/ 03 марта 2011

Это потому, что вы выбрали 169 498 записей в подзапросе:

SELECT PID
FROM tblChild

Это лот .Вся таблица tblChild, возможно, сканируется, считывается с диска, столбец PID отделяется и сохраняется где-то в памяти, все 169 498 значений.Затем вы читаете все 7211 записей и проверяете для каждого, находится ли он в огромном наборе данных дочерних идентификаторов PID размером 169 498.Это много работы для Access.

...