Postgresql 迭代数组字段并将记录用于另一个查询
Postgresql Iterate over an array field and use the records for another query
我正在尝试遍历数组字段以便将每条记录用作
查询并最终加入所有结果的参数,但我需要帮助才能获得它。
我有一个 table,它有一个名为 fleets
的数组字段,它可以有一个或多个值,即。 {1,2,3}
我需要遍历每个值以获得属于这些车队的所有车辆。
通过子查询,我得到 3 行这些值 1
、2
、3
SELECT * FROM vehicles WHERE fleet_fk=(
SELECT unnest(fleets) FROM auth_user WHERE id=4)
我正在使用 PostgreSQL 9.4。
如果您的查询引发 ERROR: more than one row returned by a subquery used as an expression
,这意味着您应该使用 ANY
:
SELECT * FROM vehicles
WHERE fleet_fk = ANY(
SELECT unnest(fleets) FROM auth_user WHERE id=4)
由于 fleets
是一个数组列,您有几个选择。
要么直接使用ANY
构造(不需要unnest()
):
SELECT * FROM vehicles
WHERE fleet_fk = ANY(SELECT fleets FROM auth_user WHERE id = 4);
或重写为连接:
SELECT v.*
FROM auth_user a
JOIN vehicles v ON v.fleet_fk = ANY(a.fleets)
WHERE a.id = 4;
或者你可以unnest()
,那么你就不需要ANY
了:
SELECT v.*
FROM auth_user a
, unnest(a.fleets) fleet_fk -- implicit LATERAL join
JOIN vehicles v USING (fleet_fk)
WHERE a.id = 4;
这是假设您在 auth_user
中没有另一个名为 fleet_fk
的列。在这种情况下,为连接使用更明确的 ON
子句以避免歧义。
请注意 两个实现 ANY
。
野兽的行为基本上是一样的,只是喂养不同而已。
数据库设计
考虑规范化数据库模式中隐藏的多对多(或一对多?)关系:
- How to implement a many-to-many relationship in PostgreSQL?
我正在尝试遍历数组字段以便将每条记录用作 查询并最终加入所有结果的参数,但我需要帮助才能获得它。
我有一个 table,它有一个名为 fleets
的数组字段,它可以有一个或多个值,即。 {1,2,3}
我需要遍历每个值以获得属于这些车队的所有车辆。
通过子查询,我得到 3 行这些值 1
、2
、3
SELECT * FROM vehicles WHERE fleet_fk=(
SELECT unnest(fleets) FROM auth_user WHERE id=4)
我正在使用 PostgreSQL 9.4。
如果您的查询引发 ERROR: more than one row returned by a subquery used as an expression
,这意味着您应该使用 ANY
:
SELECT * FROM vehicles
WHERE fleet_fk = ANY(
SELECT unnest(fleets) FROM auth_user WHERE id=4)
由于 fleets
是一个数组列,您有几个选择。
要么直接使用ANY
构造(不需要unnest()
):
SELECT * FROM vehicles
WHERE fleet_fk = ANY(SELECT fleets FROM auth_user WHERE id = 4);
或重写为连接:
SELECT v.*
FROM auth_user a
JOIN vehicles v ON v.fleet_fk = ANY(a.fleets)
WHERE a.id = 4;
或者你可以unnest()
,那么你就不需要ANY
了:
SELECT v.*
FROM auth_user a
, unnest(a.fleets) fleet_fk -- implicit LATERAL join
JOIN vehicles v USING (fleet_fk)
WHERE a.id = 4;
这是假设您在 auth_user
中没有另一个名为 fleet_fk
的列。在这种情况下,为连接使用更明确的 ON
子句以避免歧义。
请注意 两个实现 ANY
。
野兽的行为基本上是一样的,只是喂养不同而已。
数据库设计
考虑规范化数据库模式中隐藏的多对多(或一对多?)关系:
- How to implement a many-to-many relationship in PostgreSQL?