如何使用我的案例加入Postgres查询?

时间:2014-06-06 09:51:25

标签: sql postgresql join postgresql-9.1 self-join

我正在尝试获取产品namecateg_id。我有两张桌子,

product_template

categ_id     name
7            Nokia classic
7            Nokia lumia
8            samsung s3
6            huawai

此表格包含我想要的product

product_category

id       name         parent_id   
6        phones       3
7        nokia        6
8        samsung      6

此表显示哪个产品位于phone > nokiaphone > samsung下,或者产品可以直接在电话下显示,

phones > huawai
phones > nokia   > Nokia classic
phones > nokia   > Nokia lumia
phones > samsung > samsung s3

我正在使用的查询是,

select pt.categ_id,pt.name from product_template pt inner join product_category pc on
pt.categ_id=pc.id where pc.parent_id='6'

显示除huawai ???

以外的所有产品

查询的运行方式应该可以直接获得phone下的产品phone > nokia > Nokia Classic

提前感谢您的建议。

1 个答案:

答案 0 :(得分:4)

如果您只想获取某个类别下的模板以及该类别的子类别下的模板,请使用该查询:

select pt.categ_id, pt.name
from product_template pt
inner join product_category pc on pt.categ_id = pc.id
where '6' in (pc.id, pc.parent_id)

但是,它仅选择所选类别的1个级别范围内的模板。如果您想选择所有后代类别'模板,您可以使用recursive common table expression

with recursive rpc(id) AS (
    select '3'::int
  union all
    select id
    from product_category pc
    where pc.parent_id = rpc.id
)
select pt.categ_id, pt.name
from product_template pt
inner join rpc on pt.categ_id = rpc.id