在这里挣扎着我的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));
非常感谢您的帮助!
编辑:查询工作正常,但我所追求的是它是如何工作的以及它如何返回它所做的记录。
答案 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_name
和plane_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));