Предполагая, что таблица A имеет столбец с именем id
, а таблица B имеет столбец с именами a_id
и value
, вы можете использовать комбинацию outer join
и некоторого group
ing для подачи case
выписать некоторые совокупные значения.
select
a.id,
case
when (max(b.a_id) is null) then "red" -- No match found
when (min(b.value) = "NONE" and max(b.value) = "NONE") then "red" -- All B values are "NONE"
when (min(b.value) = "ALL" and max(b.value) = "ALL") then "green" -- All B values are "ALL"
when (max(case when (b.value = "PARTIAL") then 1 else 0 end) = 1) then "yellow" -- At least one B value contains "PARTIAL"
when (max(case when (b.value = "NONE") then 1 else 0 end) = 1 and max(case when (b.value = "ALL") then 1 else 0 end) = 1) then "yellow" -- A mix of "NONE" and "ALL"
else "Undefined"
end
from
table_a a
left outer join table_b b
on (a.id=b.a_id)
group by
a.id
Большая часть логики здесь в выражении case
. Использование min()
и max()
для сравнения значений в таблице B довольно просто и должно быть самоочевидным - если нет, просто добавьте min(b.value)
и max(b.value)
в ваш оператор выбора, чтобы увидеть, какие значения выводятся , чтобы помочь визуализировать это. Самое сложное для понимания - это правило для «частичного». Эта часть оператора case оценивает значение каждой строки из таблицы B, и если она является «частичной», то она возвращает значение «1» для этой строки. После того, как запрос оценил все строки B для группы, он выбирает значение max()
, чтобы посмотреть, было ли когда-либо возвращено «1».