从其他表中选择某个id之后的所有行

时间:2018-04-21 21:38:26

标签: sql sqlite

对于作业,我必须从数据库中做一些咨询。

Here is what the database looks like.

我需要找到口袋妖怪“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。提前谢谢。

2 个答案:

答案 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'));

(第二个子查询只返回一个值。)