3

MS Access と SQL Server バックエンドを使用して、別のテーブルの Parameter フィールドのグループを基本的に格納するテーブルを 1 つ持っています。

たとえば、TBL_Parameter に格納されているパラメーターがあります: (データの非常に小さなサブセットのみ)

パラメータ
鉄(Fe)
鉄(Fe)-溶存
鉄 (Fe) - 合計

テーブル TBL_ParentParameter は次のようになります。

親子
鉄(Fe) 鉄(Fe)-溶存
鉄 (Fe) 鉄 (Fe)-合計

次に、TBL_ParentParameter に子として含まれていないすべてのパラメーターを、TBL_ParentParameter に含まれているすべてのパラメーターと結合するクエリを作成したいので、次のユニオン クエリを作成しました。

SELECT Parameter, Parameter AS Child
FROM TBL_Parameter
WHERE Parameter NOT IN(SELECT Child FROM TBL_ParentParameter)
UNION
SELECT Parent AS Parameter, Child
FROM TBL_ParentParameter

これにより、次の期待される結果が得られます。

親子
鉄(Fe) 鉄(Fe)
鉄(Fe) 鉄(Fe)-溶存
鉄 (Fe) 鉄 (Fe)-合計

しかし、代わりに次のようになります:

親子
鉄(Fe) 鉄(Fe)
鉄(Fe)-溶解 鉄(Fe)-溶解
鉄 (Fe) - 合計 鉄 (Fe) - 合計

現在、ユニオン クエリ内の各クエリは個別には問題なく機能しますが、ユニオン化すると正しく機能しません。これとまったく同じクエリを SQL サーバーへのパススルー クエリとして直接試してみましたが、問題なく動作しましたが、このクエリに基づいて他のクエリを実行すると、実行に数倍の時間がかかることがわかりました。それで、ここで何が問題なのか誰にもわかりませんか?これは、ある種の MS Access のバグですか? それとも私はこれを間違って見ていますか?

解決済み: これは MS Access のバグのようで、2 つのユニオン サブクエリの順序を逆にすることで問題が修正されました。

4

3 に答える 3

2

あなたの質問は正しいです。私はそれを実行し、あなたが投稿したコードの最後から2番目のチャンクを取得しました。

于 2012-08-08T18:17:09.207 に答える
2

これは MS Access のバグのようで、2 つのユニオン サブクエリの順序を逆にすることで問題が解決しました。

于 2012-08-10T18:43:43.127 に答える
1

最初のクエリのParameterように、フィールドにエイリアスを設定することに関係していると思います。Child次に、2 番目のクエリで参照すると、Access は、最初のクエリ (つまり、フィールド)Childの別名定義を使用することを想定します。ChildParameter

ParentUNION でクエリの順序を逆にすることで問題が解決する場合がありますが、 の可能な値が複数ある場合、フィールドで問題が発生する可能性があるようですParent

より良い解決策は、フィールド名を完全に修飾することです (または、既存のフィールドと競合しないエイリアスを使用するだけです)。

SELECT P.Parameter, P.Parameter AS Child
FROM TBL_Parameter AS P
WHERE P.Parameter NOT IN (SELECT SubPP.Child FROM TBL_ParentParameter AS SubPP)
UNION
SELECT PP.Parent AS Parameter, PP.Child
FROM TBL_ParentParameter AS PP
于 2012-08-08T19:24:36.547 に答える