在WHERE子句中需要满足两个条件的SQL

问题描述 投票:0回答:3

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

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的Localities。在小示例表中,那只是公园。其他地方只有一个或另一个物种。

我尝试过

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

但未返回任何结果。我的表有1000多个观测值,它基于eBird data,并且这两个物种在全国各地都很普遍,因此必须至少有一个list_ID同时出现。在我的示例表中,只有Park(基于list_ID 001)符合我要查找的条件。

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

sql postgresql relational-division
3个回答
0
投票

您可以首先编写一个查询,该查询返回“拥有”两种啄木鸟的list_ids。 (按list_id分组,并在hading子句中写入一个条件,该条件将返回ID)。

类似

max(case when common_name like ‘hairy%’ then 1 else 0 end) = 1 
and max(case when common_name like ‘downy%’     then 1 else 0 end) = 1

然后,您可以使用该查询为所需的list_ids筛选基表。


0
投票

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

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'

0
投票

首先过滤表,group by Locality,然后仅返回包含两种类型的位置:

select Locality
from tablename
where Common_name in ('Downy Woodpecker', 'Hairy Woodpecker')
group by Locality
having count(distinct Common_name) = 2

count(distinct Common_name) = 2子句中的条件HAVING确保同一Locality的两种都存在。如果在同一Common_name中没有重复的Locality,则也可以从distinct中省略count()。参见demo。结果:

| locality |
| -------- |
| Park     |
© www.soinside.com 2019 - 2024. All rights reserved.