是否可以使用连接而不是子查询重写此SQL语句?

时间:2015-07-16 19:33:22

标签: sql database sqlite

我有三张桌子:

动物

| animal_id | animal_label |
|-----------|--------------|
| 1         | Elephant     |
| 2         | Fish         |
| 3         | Monkey       |
| 4         | Snake        |

水果

| fruid_id | fruit_label |
|----------|-------------|
| 1        | Apples      |
| 2        | Oranges     |
| 3        | Peanuts     |
| 4        | Bananas     |

喜欢:

| animal_id | fruit_id |
|-----------|----------|
| 1         | 1        |
| 2         | 2        |
| 3         | 3        |
| 3         | 4        |
| 4         | 1        |

每只动物都可以喜欢多种水果,每种水果都可以被多种动物所喜爱,所以我在动物和水果之间有多对多的关系。使用名为 likes 的第三个表来描述这种关系。

我想确定哪些动物不喜欢香蕉。为此,我写了这句话:

SELECT animal_id, animal_label
FROM animals
WHERE animal_id NOT IN (
    SELECT animal_id
    FROM likes
    WHERE fruit_id = 4)

成功地使大象,鱼和蛇,但不是猴子,因为猴子喜欢香蕉。

但是,我想知道是否可以使用连接重写此语句。这是我到目前为止所尝试的:

SELECT animal_id, animal_label
FROM animals
LEFT OUTER JOIN likes ON animals.animal_id = likes.animal_id
WHERE fruit_id <> 4 OR fruit_id IS NULL

这次,所有四只动物都归还了。这里的问题是,因为猴子也喜欢花生,这个声明即使它喜欢香蕉也会回归它。有没有办法解决这个问题比使用子查询的解决方案更好?

1 个答案:

答案 0 :(得分:2)

您可以按动物分组,只拍摄fruit_id = 4

零次的动物
SELECT animal_id, animal_label
FROM animals
LEFT OUTER JOIN likes ON animals.animal_id = likes.animal_id
GROUP BY animal_id, animal_label
HAVING sum(fruit_id = 4) = 0