在 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.