在这里苦苦挣扎我的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_name
和plane_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));