首页 > 解决方案 > 需要在 WHERE 子句中满足两个条件的 SQL

问题描述

我有鸟类观察表。这是一个例子:

Unique_ID  List_ID  Locality    Common_name
A1         001      Park        Downy Woodpecker
A2         001      Park        Hairy Woodpecker
A3         001      Park        Carolina Chickadee
B1         002      Campground  Blue Jay
B2         002      Campground  Hairy Woodpecker
C1         003      Backyard    Downy Woodpecker
C2         003      Backyard    American Goldfinch
D1         004      School      American Goldfinch
D2         004      School      Hairy Woodpecker
E1         005      Park        Downy Woodpecker
E2         005      Park        Carolina Chickadee

我正在尝试为 PostgreSQL 编写一个查询,该查询将只返回同时出现啄木鸟、Downy 和 Hairy 的地区。在小示例表中,那只是公园。其他地方只有一种或另一种。

我试过了

SELECT List_ID, LOCALITY, COMMON_NAME FROM table
WHERE COMMON_NAME = 'Downy Woodpecker' and COMMON_NAME = 'Hairy Woodpecker';

但没有返回任何结果。我的表有 1,000 条观测值,它基于eBird 数据,这两个物种在全国范围内普遍存在,因此必须至少有一个 list_ID 同时出现它们。在我的示例表中,只有 Park(基于 list_ID 001)满足我正在寻找的条件。

如果我理解IN,它将返回满足任一条件的行。任何示例 list_IDs 都适用于该查询,但这不是我想要的。如何编写强制WHERE满足多个条件的查询?

标签: sqlpostgresqlrelational-division

解决方案


您可以将表与自身连接以获取所需的位置。例如:

select distinct a.locality
from my_table a
join my_table b on a.locality = b.locality
where a.common_name = 'Downy Woodpecker'
  and b.common_name = 'Hairy Woodpecker'

推荐阅读