对于作业,我必须从数据库中做一些咨询。
我需要找到口袋妖怪“bulbasaur”的所有动作,并列出他们的名字,力量,pp和准确性。
我已经尝试过这个命令,因此我只得到9个中的一个移动:
SELECT name, power, pp, accuracy
FROM MOVES
WHERE id=(SELECT move_id FROM POKEMONS_MOVES WHERE pokemon_id=(SELECT id
FROM POKEMONS WHERE name="bulbasaur"));
vine-whip|45|25|100
我正在使用sqlite3 btw。提前谢谢。
答案 0 :(得分:1)
由于中间有一个CrossRef表,因此可以通过Joins轻松实现。
SELECT
m.name, m.type_id, m.power, m.pp, m.accuracy
FROM
Moves m
INNER JOIN
Pokemons_Moves pm ON pm.move_id = m.id
INNER JOIN
Pokemons p ON p.id = pm.pokemon_id
WHERE
p.name = "bulbasaur"

答案 1 :(得分:0)
您正在使用scalar subqueries:
WHERE id=(SELECT ...)
这意味着如果子查询返回多行,则数据库将忽略除第一行之外的所有行。 (如果发生这种情况,其他数据库将会出错。)
要搜索子查询返回的所有ID,您必须使用IN operator:
SELECT name, power, pp, accuracy
FROM Moves
WHERE id IN (SELECT move_id
FROM Pokemons_Moves
WHERE pokemon_id = (SELECT id
FROM Pokemons
WHERE name = 'bulbasaur'));
(第二个子查询只返回一个值。)