如何在SQL中将EXISTS和NOT EXISTS替换为JOIN,以便将其转换为关系代数



我想在以下查询中替换EXISTS和NOT EXISTS:

SELECT pokemon_name FROM sinnohdex s
WHERE NOT EXISTS
(SELECT * FROM hoenndex h
WHERE s.id = h.id)
AND EXISTS
(SELECT * FROM johtodex j
WHERE j.id = s.id);

这就是我目前所掌握的:

SELECT pokemon_name FROM sinnohdex s
LEFT JOIN hoenndex h ON s.id = h.id
INNER JOIN johtodex j ON j.id = s.id
WHERE h.id IS NULL;

我的目标是以后;翻译";对关系代数的查询
我不知道这是否准确
我们的想法是只使用联接来编写查询
这样对吗?

我建议使用LEFT JOININNER JOIN,如下所示:

SELECT distinct pokemon_name 
FROM sinnohdex s JOIN johtodex j ON j.id = s.id
LEFT JOIN hoenndex h ON s.id = h.id
WHERE h.id is null

关闭,但不完全关闭。我建议:

SELECT s.pokemon_name
FROM sinnohdex s JOIN
(SELECT DISTINCT j.id
FROM johtodex j
) j
ON j.id = s.id LEFT JOIN
hoenndex h
ON s.id = h.id
WHERE h.id IS NULL;

子查询中需要SELECT DISTINCT,以确保JOIN不会产生重复项。

在加入之前删除重复项通常比在加入之后删除重复项更高效(尽管这可能取决于数据(。

最新更新