БД скрипка БД скрипка (обновлено)
Обращаю внимание на 1-2;3-4 случая.Обратите внимание, что все строки из config_id
сгруппированы вместе со всеми строками из xgroup
Подробное описание задачи: у меня есть некоторые детали заказа для некоторого ресурса.Для каждого заказанного ресурса должен быть выделен ресурс.Ресурс может принадлежать друг другу и принадлежать какой-то группе.Рассмотрим виртуальную машину с виртуальной машиной: RAM, CPU, HDD.
В настоящее время связь между заказами и выделенными ресурсами нарушена.Я пытаюсь написать запрос, чтобы проанализировать, что заказано без выделенного ресурса, а что выделено без заказа.
CREATE TABLE order_detail (
id SERIAL,
order_id INTEGER,
resource_type_id INTEGER,
allocated_resource_id INTEGER,
amount INTEGER
)
CREATE TABLE allocated_resource (
id SERIAL,
group_id INTEGER,
resource_type_id INTEGER,
resource_uuid UUID,
)
Это легко сделать:
select * from order_detail od
where od.allocated_resource_id IS NULL
SELECT * FROM allocated_resource ar
WHERE NOT EXISTS ( SELECT 1 FROM order_detail od where od.allocated_resource_id = ar.id)
Но мне нужно найти, к какомуПорядок присвоения выделенного ресурса.Или какой ресурс выделить для этого заказа.Или какой порядок привязки к выделенному ресурсу.
Пример данных:
id | order_id | allocated_resource_id | resource_type_id
--------------------------------------------------------
41 | 1 | 1 | 70
42 | 1 | | 71
43 | 1 | | 73
44 | 2 | | 70
45 | 2 | 5 | 71
id | group_id | resource_type_id
--------------------------------
1 | 1 | 70
2 | 1 | 71
3 | 1 | 72
4 | 2 | 70
5 | 2 | 71
6 | 2 | 73
Здесь я хочу получить:
id | order_id | allocated_resource_id | resource_type_id | ar.id | ar.group_id | ar.resource_type_id
----------------------------------------------------------------------------------------------------
41 | 1 | 1 | 70 | 1 | 1 | 70
42 | 1 | | 71 |
43 | 1 | | 73 |
| | | | 1 | 1 | 71
| | | | 1 | 1 | 72
44 | 2 | | 70 |
45 | 2 | 5 | 71 | 5 | 1 | 71
| | | | 4 | 1 | 70
| | | | 6 | 1 | 73
К сожалению order by ar.id
или order by od.id
будетпереместить несвязанные детали заказа / выделенный ресурс вниз.Я хочу сохранить детали заказа / выделенные ресурсы вместе, как в примере выше.
Для решения задачи я сначала выбираю все доступные связанные группы:
od_ar_group AS (
SELECT
od.order_id, ar.group_id,
cast( od.order_id AS TEXT ) || '-' || cast( ar.group_id AS TEXT ) AS odar
FROM order_detail od
FULL JOIN allocated_resource ar ON ar.id = od.allocated_resource_id
WHERE od.order_id IS NOT NULL AND ar.group_id IS NOT NULL
GROUP BY od.order_id, ar.group_id
)
Затем я присоединяю информацию о группе к обеим таблицам:
SELECT od.*, odar.odar
FROM order_detail od
LEFT JOIN od_ar_group odar ON odar.order_id = od.order_id
SELECT ar.*, odar.odar
FROM allocated_resource ar
LEFT JOIN od_ar_group odar ON odar.parent_id = ar.parent_id
Наконец-то я могу присоединиться к этим группам и сортировать их внутри.Таким образом, детали несвязанного заказа / выделенный ресурс внутри группы, а не внизу таблицы :
SELECT
CASE WHEN od.odar IS NOT NULL THEN od.odar ELSE ar.odar END AS odar,
od.*, ar.*
FROM od_grouped
FULL JOIN ar_grouped ar ON ar.odar = od.odar
AND ar.id = od.allocated_resource_id
ORDER BY odar, CASE WHEN od.id IS NULL THEN 1 WHEN ar.id IS NULL THEN 2 ELSE 0 END, od.id NULLS LAST
Есть ли более простой способ сохранить связанные строки внутри их группы?