1

親子のようなテーブルが2つあります。親テーブルには、7211レコードがあります。チャイルドには、169498レコードがあります。これら2つのテーブルの間には、関係はありません(つまり、外部キーは設定されていませんが、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
)

実際の番号で実行します。レコードの中で、MSAccess2000は突然停止します。10レコードでテストすると、正しく動作します。主な原因は何ですか?レコードはありませんか?

私は別の方法を試します。

SELECT C.PID, P.PID
FROM tblChild C, tblParent P
WHERE C.PID <> P.PID

このとき、乗算結果が出ます。(つまり、すべてのP.PIDを含む1つのC.PIDを意味し、その後など...)

Access 2000で最短の実行時間内に余分なレコードや欠落しているレコードを取得するにはどうすればよいですか?

4

2 に答える 2

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
)

残念ながら、これをテストするためのアクセス権がありません。役立つことを願っています

于 2011-03-03T10:48:14.310 に答える
0

これは、サブクエリで 169 498 レコードを選択したためです。

SELECT PID
FROM tblChild

それはたくさんあります。tblChild テーブル全体がスキャンされ、ディスクから読み取られる可能性があります。PID 列は分離され、メモリ内のどこかに保存されます。すべての 169 498 の値です。次に、すべての 7211 レコードを読み取り、子 PID の 169,498 サイズの巨大なデータセットに含まれていないかどうかをそれぞれチェックします。これは Access にとって大変な作業です。

于 2011-03-03T08:58:26.247 に答える