使用 NOT EXISTS 进行 SQL 查询,以确定另一个属性是否具有特定值



在这里苦苦挣扎我的SQL查询。我有一张桌子:

应用程序(ID,游戏)其中 id 是主键。

我想做的是显示所有使用ID的id,他们至少使用ID为"Tim"的人所做的所有游戏。我有一个有效的查询,并返回我需要它的内容,但我从论坛中将其拼凑在一起。因此,我真正想要的是查询工作原理的快速和基本概述。大量的细节不是必需的,因为我理解大多数术语,但只是查询的作用,以及它如何确定正确的记录。

我的查询是:

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));

非常感谢您的任何帮助!

编辑:查询工作正常,但我所追求的是它的工作原理以及它如何返回它所做的记录。

查询工作正常,但我所追求的是它的工作原理和方式 返回它所做的记录。

对,所以你遇到了一个叫做关系分裂的问题。 乔·塞尔科(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根本没有意义。

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。 只有这样,才会咨询到将蒂姆的游戏与过滤后的 id 相匹配的完整表。

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));

最新更新