0

ここで私のSQLクエリに苦労しています。私はテーブルを持っています:

APPS(id, game) id は主キーです。

私がやろうとしていたのは、ID「Tim」を持つ人が行う少なくともすべてのゲームを使用するすべての ID を表示することです。機能するクエリがあり、必要なものを返しますが、フォーラムからまとめました。ですから、私が本当に望んでいるのは、クエリがどのように機能するかについての簡単で基本的な概要です。ほとんどの用語を理解しているので、詳細は必要ありませんが、クエリが何を行い、どのように正しいレコードを決定するかだけです。

私のクエリは次のとおりです。

SELECT id
FROM APPS X
WHERE NOT EXISTS
     (SELECT *
      FROM APPS Y
      WHERE id='Tim' AND NOT EXISTS
           (SELECT *
            FROM APPS Z
            WHERE Z.id = A.id AND Z.id = Y.id));

助けてくれてありがとう!

編集:クエリは正常に機能しますが、私が求めていたのは、それがどのように機能し、どのようにレコードを返すかです。

4

3 に答える 3

3

クエリは正常に機能しますが、私が求めていたのは、それがどのように機能し、どのようにレコードを返すかです。

そうです、関係分割と呼ばれる問題にぶつかりました。Joe Celko はそれについて良い記事を書いています。

あなたが投稿したクエリは本当に奇妙です:

WHERE Z.id = A.id AND Z.id = Y.id

関係分割では、最も内側のnot existsクエリに、異なる列に対する 2 つの等価ステートメントがあります。たとえば、Joe Celko の投稿から:

WHERE (PS1.pilot_name = PS2.pilot_name)
      AND (PS2.plane_name = Hangar.plane_name)

比較pilot_nameしてplane_nameは意味がありますが、 id2 回比較してもまったく意味がありません。

于 2012-10-11T08:56:05.083 に答える
2
SELECT prefiltered.id
FROM (select count(distinct game) games from apps where id='Tim') tim
join (select id from apps
      where id<>'Tim'
      group by id
      having count(distinct game) >= tim.games) prefiltered
JOIN apps a on a.id = 'Tim'
JOIN apps b on b.id = prefiltered.id and b.game = a.game
group by prefiltered.id
having count(distinct b.game) = tim.games

少し言葉遣いで、小さなテーブルにはやり過ぎかもしれません。アイデアは、Timが持っているゲームを事前にカウントし、少なくともその数のゲームでIDをすばやく事前にフィルタリングすることです。その場合にのみ、TimのゲームをフィルタリングされたIDに一致させる完全なテーブルが参照されます。

于 2012-10-11T08:44:22.623 に答える
0
Please provide colname as per common between table :

SELECT id
FROM APPS X
WHERE colname NOT in
     (SELECT colname
      FROM APPS Y
      WHERE id='Tim' AND colname NOT in
           (SELECT colname
            FROM APPS Z
            WHERE Z.id = A.id AND Z.id = Y.id));
于 2012-10-11T08:41:31.363 に答える