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查询有两个针对不同列的相等语句。例如,来自 Joe Celko 的帖子:

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

比较pilot_nameplane_name有意义,而比较id两次根本没有意义。

于 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 回答