在 PostgreSQL 中,计算有多少观察值与另一个 table 中的条件列表相匹配
In PostgreSQL, count how many observations match a list of criteria in another table
假设我有一个 table、cars
,它看起来像这样:
id | model | car_color
----+--------+--------
01 | Camry | blue
02 | Elantra| red
03 | Sienna | blue
04 | Camry | fuschia
05 | LX450 | pink
06 | Tundra | lime
另外假设我还有另一个 table,一种非穷尽的颜色,colors
:
colors
-------
blue
red
fuschia
在 Postgres 中(或者可能在任何 SQL 变体中),我如何计算 cars.car_color
中有多少条目与 colors.colors
中的任何条目匹配?
这里的答案是4,因为'pink'和'lime'没有出现在colors
table中,但我无法让Postgres吐槽这还给我。 (在我实际进行的工作中,第一个 table 有数千万行,而我正在检查的第二个 table 大约有 100k。)我正在尝试这样的事情,无济于事:
select count(*) from cars
where "car_color" IN (colors.colors)
这是错误:
[42P01] ERROR: missing FROM-clause entry for table "colors"
我的直觉是这与我的 WHERE 语句有关,但我不知道是什么。我似乎也无法以在 Google 或 SX 搜索中获得良好搜索结果的方式来表达这一点——我知道我不是第一个(或第 257 个)提出这个问题的人。
关闭。您需要一个子查询:
select count(*)
from cars c
where c.car_color IN (select co.color from colors co);
Postgres 作为一个很好的优化器,但有时 exists
效果更好:
select count(*)
from cars c
where exists (select 1 from colors co where co.color = c.car_color);
Here 是一个 db<>fiddle.
假设我有一个 table、cars
,它看起来像这样:
id | model | car_color
----+--------+--------
01 | Camry | blue
02 | Elantra| red
03 | Sienna | blue
04 | Camry | fuschia
05 | LX450 | pink
06 | Tundra | lime
另外假设我还有另一个 table,一种非穷尽的颜色,colors
:
colors
-------
blue
red
fuschia
在 Postgres 中(或者可能在任何 SQL 变体中),我如何计算 cars.car_color
中有多少条目与 colors.colors
中的任何条目匹配?
这里的答案是4,因为'pink'和'lime'没有出现在colors
table中,但我无法让Postgres吐槽这还给我。 (在我实际进行的工作中,第一个 table 有数千万行,而我正在检查的第二个 table 大约有 100k。)我正在尝试这样的事情,无济于事:
select count(*) from cars
where "car_color" IN (colors.colors)
这是错误:
[42P01] ERROR: missing FROM-clause entry for table "colors"
我的直觉是这与我的 WHERE 语句有关,但我不知道是什么。我似乎也无法以在 Google 或 SX 搜索中获得良好搜索结果的方式来表达这一点——我知道我不是第一个(或第 257 个)提出这个问题的人。
关闭。您需要一个子查询:
select count(*)
from cars c
where c.car_color IN (select co.color from colors co);
Postgres 作为一个很好的优化器,但有时 exists
效果更好:
select count(*)
from cars c
where exists (select 1 from colors co where co.color = c.car_color);
Here 是一个 db<>fiddle.