【发布时间】:2015-04-14 12:24:57
【问题描述】:
使用 Postgres。
我有一个pricelists
CREATE TABLE pricelists(
id SERIAL PRIMARY KEY,
name TEXT,
parent_id INTEGER REFERENCES pricelists
);
另一个表,prices,引用它
CREATE TABLE prices(
pricelist_id INTEGER REFERENCES pricelists,
name TEXT,
value INTEGER NOT NULL,
PRIMARY KEY (pricelist_id, name)
);
- 父价目表
id=1可能有 10 个价格。 - 价格表
id=2作为父级1的子级可能有5 个价格覆盖父级1相同价格名称的价格。 - 子价目表
id=3作为价目表2的子价目,可能有2 个价格覆盖同价名的子价目表2。
所以当我问孩子3价格时,我想得到
- 所有儿童价格
3和 - 他的父母(孩子
2)在孩子3中不存在的价格和 - 所有父级
1直到现在才存在的价格。
可以更改架构以提高效率。
示例:
如果
SELECT pl.id AS id, pl.parent_id AS parent, p.name AS price_name, value
FROM pricelists pl
JOIN prices p ON pl.id = p.pricelist_id;
给予
| id | parent | price_name | value |
|----------|:-------------:|------------:|------------:|
| 1 | 1 | bb | 10 |
| 1 | 1 | cc | 10 |
| 2 | 1 | aa | 20 |
| 2 | 1 | bb | 20 |
| 3 | 2 | aa | 30 |
然后我正在寻找一种获取pricelist_id = 3 价格的方法
| id | parent | price_name | value |
|----------|:-------------:|------------:|------------:|
| 1 | 1 | cc | 10 |
| 2 | 1 | bb | 20 |
| 3 | 2 | aa | 30 |
【问题讨论】:
-
请一如既往地提供您的 Postgres 版本。
SELECT version()。并展示你尝试过的东西,即使它不起作用。 -
示例中的价格表
1是否应该将其自身作为父级,而不是NULL?
标签: sql postgresql greatest-n-per-group common-table-expression recursive-query