Как сохранить родственные группы вместе? - PullRequest
0 голосов
/ 25 декабря 2018

БД скрипка БД скрипка (обновлено)

Обращаю внимание на 1-2;3-4 случая.Обратите внимание, что все строки из config_id сгруппированы вместе со всеми строками из xgroup enter image description here

Подробное описание задачи: у меня есть некоторые детали заказа для некоторого ресурса.Для каждого заказанного ресурса должен быть выделен ресурс.Ресурс может принадлежать друг другу и принадлежать какой-то группе.Рассмотрим виртуальную машину с виртуальной машиной: 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

Есть ли более простой способ сохранить связанные строки внутри их группы?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...