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

时间:2012-10-11 08:38:03

标签: sql subquery exists

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

APPS(身份证,游戏) 其中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));

非常感谢您的帮助!

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

3 个答案:

答案 0 :(得分:3)

  

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

是的,所以你遇到了一个名为Relational Division的问题。 Joe Celko写了一篇关于good article的文章。

您发布的查询真的很奇怪:

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两次毫无意义。

答案 1 :(得分: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

有点讽刺,对于小桌子来说可能有些过分。这个想法是预先计算蒂姆所拥有的游戏,并快速预先过滤至少那些游戏的ID。只有这样,全桌才会将蒂姆的游戏与过滤的ids'进行匹配。

答案 2 :(得分: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));