Выберите значение в связанной таблице, если оно уникальное, или пустое, если не с оракулом - PullRequest
1 голос
/ 18 июня 2019

У меня есть таблица ПАКЕТОВ и таблица ITEMS. У них есть отношения один ко многим. Кроме того, каждый элемент принадлежит бренду, на который ссылается id. Имеется следующая упрощенная структура базы данных:

PACKAGES
package_id

PACKAGE_ITEM
package_id
item_id

ITEMS
item_id
brand_id

BRANDS
brand_id
description

Как я могу запросить пакеты и получить столбец с маркой (описанием), если он уникален для всех своих товаров; и пусто, если нет?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 18 июня 2019

Присоединяйтесь к таблицам и группируйте по package_id. Затем с помощью оператора CASE определите, существует ли только 1 марка для всех товаров:

select
  package_id,
  case 
    when count(distinct b.brand_id) = 1 then max(b.description) 
    else null
  end brand_description 
from packages p
inner join package_item pi on pi.package_id = p.package_id
inner join items i on i.item_id = pi.item_id
inner join brands b on b.brand_id = i.brand_id
group by p.package_id
0 голосов
/ 18 июня 2019

Один метод - агрегация с выражением case:

select pi.package_id,
       (case when min(i.brand_id) = max(i.brand_id)  -- all the same
             then min(i.brand_id)
        end) as package_brand_id
from package_item pi join
     items i
     on pi.item_id = i.item_id
group by pi.package_id;

Если вы хотите описание, вы присоединитесь к brands:

select pi.package_id,
       (case when min(b.description) = max(b.description)  -- all the same
             then min(b.description)
        end) as package_brand_id
from package_item pi join
     items i
     on pi.item_id = i.item_id join
     brands b
    on i.brand_id = b.brand_id
group by pi.package_id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...