不存在用于确定其他属性是否具有特定值的SQL查询

不存在用于确定其他属性是否具有特定值的SQL查询,sql,subquery,exists,Sql,Subquery,Exists,在这里,我正在努力处理一个SQL查询。 我有一张桌子: APPSid,游戏 其中id是主键 我想做的是显示所有id的人,他们至少使用id为Tim的人玩的所有游戏。 我有一个有效的查询,并返回我需要的内容,但我是从论坛拼凑而成的。 所以我真正想要的是一个关于查询工作原理的快速而基本的概述。因为我了解大多数术语,所以不需要详细说明,只需要知道查询的作用,以及它如何确定正确的记录 我的问题是: SELECT id FROM APPS X WHERE NOT EXISTS (SELECT *

在这里,我正在努力处理一个SQL查询。 我有一张桌子:

APPSid,游戏 其中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));
非常感谢你的帮助

编辑:查询工作正常,但我想了解的是它是如何工作的,以及它如何返回记录

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));
稍微罗嗦一点,对于小桌子来说可能有点过头了。我们的想法是预先计算Tim玩过的游戏,并快速地预先过滤至少有这么多游戏的ID。只有这样,整个表才会将Tim的游戏与过滤后的ID匹配

稍微罗嗦一点,对于小桌子来说可能有点过头了。我们的想法是预先计算Tim玩过的游戏,并快速地预先过滤至少有这么多游戏的ID。只有这样,整个表才会将Tim的游戏与过滤后的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));
是的,所以你遇到了一个叫做关系划分的问题。乔·塞尔科为此写了一篇文章

您发布的查询非常奇怪:

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)
比较飞行员姓名和飞机姓名是有意义的,而两次比较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));
是的,所以你遇到了一个叫做关系划分的问题。乔·塞尔科为此写了一篇文章

您发布的查询非常奇怪:

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)


比较飞行员姓名和飞机姓名是有意义的,其中比较id两次是毫无意义的。

colname是“id”。至少我认为你是在问这个问题。这个问题是有效的,我只是不明白怎么做。我想问的是“wuery如何返回它所做的记录”。不过,谢谢你您没有在where cluse、、中提供colname,我不要求重新编写查询。我想知道我的查询到底是如何工作的。但是谢谢你,colname是id。至少我认为你是在问这个问题。这个问题是有效的,我只是不明白怎么做。我想问的是“wuery如何返回它所做的记录”。不过,谢谢你您没有在where cluse、、中提供colname,我不要求重新编写查询。我想知道我的查询到底是如何工作的。但是谢谢你。我可以看出,它受到了关系代数及其双重否定的启发,可以进行全面计算,也许有更好的方法。我觉得姓氏上的a.id没有定义。应该是X.id吗?我不这么认为。嗯,它返回了它应该返回的所有内容,所以我认为它是正确的。这是定义表a的子查询吗?在我看来,该查询忽略了游戏列,因此无法工作。我可以看出,它受到了关系代数及其双重否定的启发,可以进行全面计算,也许还有更好的办法。姓氏上的a.id在我看来没有定义。应该是X.id吗?我不这么认为。嗯,它返回了它应该返回的所有内容,所以我认为它是正确的。这是定义表a的子查询吗?在我看来,该查询忽略了游戏列,因此无法工作。哦。我喜欢你这样做。我想不存在的人对我说:谢谢!哦。我喜欢你这样做。我想不存在的人对我说:谢谢!非常感谢你!这篇文章解释了一切。非常感谢!这篇文章解释了一切。