我想在以下查询中替换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 JOIN
和INNER 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
不会产生重复项。
在加入之前删除重复项通常比在加入之后删除重复项更高效(尽管这可能取决于数据(。