我有三张桌子:
动物
| 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
这次,所有四只动物都归还了。这里的问题是,因为猴子也喜欢花生,这个声明即使它喜欢香蕉也会回归它。有没有办法解决这个问题比使用子查询的解决方案更好?
答案 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