Критерии гибернации / Oracle - Join - возврат, только если все связанные данные соответствуют условиям

1

У меня есть следующая (приблизительная) схема SQL:

brand         model        equipment
brand_id      model_id     equipment_id
brand_name    model_name   equipment_nickname
                           equipment_brand_id
                           equipment_model_id

Тогда у меня есть отношение NN между оборудованием и группой оборудования, например:

equipment <----> equipment_equipment_group <----> equipment_group

Таким образом, оборудование может принадлежать к разным группам и всему shebang.

Дело в том, что условия фильтрации этой вещи для меня странные. Я верну только любые условия, если каждое оборудование в группе заполнит условия.

Например: я могу иметь 10 брендов X и 20 брендов Y в группе. В другой группе у меня есть только 30 брендов Y. Если я отфильтрую свое оборудование по бренду Y, будет фильтроваться только вторая группа, потому что каждое оборудование в нем соответствует моим критериям.

Я строил это с помощью Hibernate Criteria, но я был бы более чем счастлив увидеть SQL для этого тоже, не нужно знать Java на этом.

Итак, это выполнимо?

  • 0
    Хотите ответ на SQL?
  • 0
    @GordonLinoff Критерии SQL или JPA, что вам больше подходит. Спасибо друг!
Теги:
hibernate

2 ответа

0

Фокус в том, чтобы сначала проверить условие для группы, а затем проверить, равен ли общий результат для этой группы общее количество продуктов в группе. Что-то вроде:

SELECT * FROM equipment
INNER JOIN equipment_equipment_group ON 
  equipment_equipment_group.equipment_id = equipment.equipment_id 
INNER JOIN equipment_group ON 
  equipment_equipment_group.equipment_group_id = equipment_group.equipment_group_id
INNER JOIN 
  (SELECT COUNT(*) as cnt, equipment_equipment_group.equipment_group_id FROM equipment 
   INNER JOIN equipment_equipment_group ON 
     equipment_equipment_group.equipment_id = equipment.equipment_id 
   WHERE 
     -- Whatever conditions
     equipment.equipment_brand_id = 1
   GROUP BY
     equipment_equipment_group.equipment_group_id) AS equip_match ON 
  equipment_equipment_group.equipment_group_id = equip_match.equipment_group_id AND
  -- Only if then nb of equipment returned by subquery equals the total number of equipment in the group
  equip_match.cnt = (SELECT COUNT(*) FROM equipment_equipment_group as eqg WHERE eqg.equipment_group_id = equip_match.equipment_group_id)   

Вот скрипка в MySQL.

0

Я думаю, что вы можете делать то, что вы хотите с having пунктом:

select eeg.equipment_equipment_group
from equipment_equipment_group eeg join
     equipment e
     on eeg.equipment_id = e.equipment_id
group by eeg.equipment_equipment_group
having sum(case when e.equipment_model_id <> 'Y' then 1 else 0 end) = 0;

Предложение having подсчитывает случаи, когда модель оборудования отсутствует в вашем списке. = 0 говорит, что нет случаев, когда это происходит.

Я отказался от некоторых дополнительных объединений (чтобы brand и model) сосредоточиться на логике.

  • 0
    Я думаю, что это может работать! Что если мне нужно добавить другие объединения? Как мне обновить мое предложение HAVING? Например, если я хочу фильтровать по модели и марке?
  • 0
    @GustavoRamos. , , Это была бы та же логика с дополнительными предложениями, связанными с AND .
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню