-1

この質問はこの質問の続きです

ただし、データベース構造にわずかな変更があります(少し単純化しすぎたため)

次のようなデータ列を持つデータベースがあります。

Key, Instance, User ID, Day, Size, Instance Type

キー- これは主キーです。
インスタンス- これは特定のインスタンスの記述子です (これは一意になります)。
ユーザー ID - これは、この表のエントリ数よりも少ない数のユーザーのうちの 1 人を指します。
- これは、特定のユーザーがこのインスタンスを作成した日です。Day 1 または Day 2 のいずれかになります。
サイズ- これは、保存されるデータのサイズです。
インスタンス タイプ- いくつかのインスタンス タイプがあります。インスタンス自体は、これらのインスタンス タイプの 1 つになります。

以前の質問では、ネストされた SQL クエリを作成して、1 日目と 2 日目にインスタンスを持ち、この場合は特定のインスタンス タイプを持つ個別のユーザーを見つけました。

現在、これらのクエリが 2 セットあります。

私が今やりたいことは、3 番目のクエリであり、ユーザー IDが他のクエリのいずれにも存在しないデータベースを返します。

これまでのところ、クエリを設定しましたが、非常に遅く ( Onステートメントの <> コンパレータと関係があります)、100% 正確に実行できるかどうかさえわかりません。

これまでの私のSQL文は次のとおりです。

Select  Max( Table.Key ) as Key, 
        Max( Table.Instance ) as Instance, 
        Table.[User ID], 
        Max( Table.Day ) as Day,
        Max( Table.Size ) as Size,
        Max( Table.[Instance Type] ) as [Instance Type]
from (((Table 
        inner join  (Select top 90  Max( Table.Key ) as Key, 
                                    Max( Table.Instance ) as Instance, 
                                    Table.[User ID], 
                                    Max( Table.Day ) as Day,
                                    Max( Table.Size ) as Size,
                                    Max( Table.[Instance Type] ) as [Instance Type]
                    from Table 
                    where   Table.[Instance Type]="type1" and 
                            Table.[Day]=1 and 
                            1=1 
                    group by Table.[User ID]) as t2 
        on Table.[User ID]<>t2.[User ID]) 
        inner join  (Select top 90  Max( Table.Key ) as Key, 
                                    Max( Table.Instance ) as Instance, 
                                    Table.[User ID], 
                                    Max( Table.Day ) as Day,
                                    Max( Table.Size ) as Size,
                                    Max( Table.[Instance Type] ) as [Instance Type]
                    from Table 
                    where   Table.[Instance Type]="type1" and 
                            Table.[Day]=2 and 
                            1=1 
                    group by Table.[User ID]) as t3 
        on Table.[User ID]<>t3.[User ID]) 

        inner join  (Select Table.[User ID] 
                    from Table 
                    where 1=1 ) as t4 
        on Table.[User ID]=t4.[User ID]) 
where Table.[Instance Type]="type1"
group by Table.[User ID];

私が求めているものを手に入れる方法についての助けやアドバイスは大歓迎です!

4

1 に答える 1

1

これを一時テーブルとしてチャンク化することから始めると、パフォーマンス チューニングが容易になる可能性があります (MS-Access では、特にロジックが非常に複雑に見えるため (したがって、保守とデバッグが難しいため)、「ビュー」または「テーブルの作成」を推測します) !):

質問のパート 1: 「前の質問で、ネストされた SQL クエリを作成して、1 日目と 2 日目にインスタンスを持ち、この場合は特定のインスタンス タイプを持つ個別のユーザーを見つけました。」

最初に「一時テーブル/テーブル作成」または「ビュー」などを使用しないのはなぜですか (実装方法に応じて、最初にその日のユーザー ID の個別のリストを取得します。

SELECT DISTINCT Table.UserID, Table.Day
INTO #DistinctListOfUserIDsWithDays /* Not sure of exact syntax in access! */
FROM Table 
WHERE Table.Day = 1 
OR Table.Day = 2

そして、上記のビュー/クエリの結果を集計し、having 句を使用することで、最初の部分を簡単に解決する、両方の日のデータを持つすべてのユーザーを取得できます。

SELECT Table.UserID, COUNT(*)
FROM #DistinctListOfUserIDsWithDays
HAVING COUNT(*) > 1
Now I have 2 sets of these queries.

re:あなたの新しいクエリ、「私が今やりたいのは3番目のクエリであり、ユーザーIDが他のクエリのいずれにも存在しないデータベースを返すことです」、上記の元のクエリ/ビューに基づく1つの簡単な解決策です:

SELECT Table.UserID
FROM Table 
WHERE UserID NOT IN (SELECT UserID FROM #DistinctListOfUserIDsWithDays)

また、#DistinctListOfUserIDsWithDays をテーブルと外部結合し、クエリの #DistinctListOfUserIDsWithDays 側で NULL を返す UserID のみを選択します...

于 2013-10-08T13:07:44.017 に答える