Использование Постгреса.
У меня есть 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
цены, которые не существуют до сих пор.
Схема может быть изменена для повышения эффективности.
Пример:
If
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 |
SELECT version()
. И покажите, что вы пробовали, даже если это не работает. - person Erwin Brandstetter   schedule 14.04.20151
в этом примере действительно иметь себя в качестве родителя, а неNULL
? - person das-g   schedule 14.04.2015