我在Postgres中有一个自定义类型:
CREATE TYPE child AS
(id integer,
name text,
surname text,
age integer);
和表
CREATE TABLE parent
(
id integer NOT NULL,
name text NOT NULL,
surname text NOT NULL,
age integer NOT NULL,
childs child[],
CONSTRAINT parent_pkey PRIMARY KEY (id)
)
我希望得到一个孩子名字=“John”的父母
我尝试过类似的东西:
select id, name
from parent
where 'John' = any (select (unnest(childs)).name from parent)
但是我收到了所有的父母。
当有人解决我的问题时,我会非常感激。
答案 0 :(得分:1)
这会有帮助吗?..
with un as (
select (unnest(childs)).name, id from parent
)
select
id
, name
from parent
join un on un.id = parent.id
where un.name = 'John'
;
答案 1 :(得分:1)
您必须以某种方式关联第一个父级和秒级父级。您可以使用Vao Tsun的查询或尝试使用相关查询:
select id, name
from parent as p1
where 'John' = any (select (unnest(childs)).name from parent as p2 where p1.id = p2.id)
答案 2 :(得分:1)
如果您对表格进行别名,则更容易看到问题:
SELECT p1.id, p1.name
FROM parent p1
WHERE 'John' = ANY (SELECT (UNNEST(p2.childs)).name FROM parent p2)
WHERE
条款甚至没有提到p1
;它正在查看parent
表的独立副本。但是根本不需要引入该表的第二个副本:
SELECT id, name
FROM parent
WHERE 'John' = ANY (SELECT (UNNEST(childs)).name)