Выберите столбец из другой таблицы, если он соответствует содержанию - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть SELECT, который проверяет состояние активных аварийных сигналов (icinga). Этот выбор объединяет разные таблицы и пока здесь все ок. В результате я имею в качестве значения / столбца также object_id. Я хотел бы добавить столбец к этому выбору, который мог бы быть пустым или нет, потому что, ища этот 'object_id' в другой таблице, я мог получить значение или нет. Эта таблица аксессуаров имеет: object_id, varname, varvalue. Итак, т.е. мой SELECT возвращает эти значения:

`name`, `object_id`, `status`
`Hello`, `123456`, `OK`

Я бы добавил столбец City, который должен сравниваться с таблицей, имеющей:

`object_id`, `varname`, `varvalue`
`123456`, `city`, `Rome`
`123456`, `lake`, `Garda`
`789789`, `city`, `Milano`

Так что если вторая таблица имеет object_id = 123456 И city = Rome результат должен быть:

`name`, `object_id`, `status`, `city`
`Hello`, `123456`, `OK`, `Rome`

В противном случае результат должен быть:

`Hello`, `123456`, `OK`, `UNKNOWN`

Как это сделать?

Надеюсь, я хорошо это объяснил: -)

Спасибо!

* РЕДАКТИРОВАТЬ *

Лучше объяснить с помощью реальный пример. Мой запрос на самом деле выглядит следующим образом:

select icinga_objects.object_id, icinga_objects.name1 as host_name, icinga_objects.name2 as ServiceName, "service" as Type, icinga_servicestatus.last_check as LastCheckTime, icinga_servicestatus.last_hard_state_change as LastStateChange, TIMEDIFF(now(), icinga_servicestatus.last_hard_state_change) AS SinceTime,
CASE
    WHEN icinga_servicestatus.current_state = 0 THEN '0'
    WHEN icinga_servicestatus.current_state = 1 THEN '2'
    WHEN icinga_servicestatus.current_state = 2 THEN '3'
    ELSE  '3'
END AS state
FROM icinga_objects, icinga_servicestatus, icinga_services WHERE icinga_servicestatus.service_object_id IN
  (SELECT service_object_id FROM icinga_services WHERE icinga_services.host_object_id IN
    (SELECT host_object_id FROM icinga_hostgroup_members WHERE hostgroup_id IN
      (SELECT hostgroup_id FROM icinga_hostgroups WHERE alias = 'MY-HOSTGROUP-TO-FILTER')
     )
  )
AND icinga_servicestatus.service_object_id NOT IN 
  (SELECT service_object_id FROM icinga_services WHERE icinga_services.service_object_id IN (
     SELECT object_id FROM icinga_objects WHERE icinga_objects.is_active = 1 AND icinga_objects.object_id IN
       (SELECT object_id FROM icinga_customvariables WHERE varvalue = '8x5')
     )
  )
AND icinga_servicestatus.last_check > NOW() - INTERVAL 3 HOUR
AND icinga_servicestatus.state_type = 1
AND icinga_servicestatus.scheduled_downtime_depth = 0
AND icinga_objects.object_id = icinga_services.service_object_id
AND icinga_servicestatus.service_object_id = icinga_services.service_object_id
AND icinga_servicestatus.current_state = 2
AND icinga_servicestatus.problem_has_been_acknowledged = 0

Это дает мне результат, например:

`object_id`, `host_name`, `ServiceName`, `Type`, `LastCheckTime`, `LastStateChange`, `SinceTime`, `State`
`123456`, `myHostName`, `myServiceName`, `service`, `2020-04-29 17:19:21`, `2020-04-28 14:50:27`, `26:32:51`, `3`

Здесь я хотел бы добавить столбец. Итак, теперь, если я найду object_id в icinga_customvariables, я смогу найти записи или нет. Например, при поиске object_id = 123456 у меня есть 4 записи, но ТОЛЬКО одна, имеющая varname = NAME_IM_SEARCHING, поэтому мне нужно добавить к приведенному выше результату соответствующий varvalue поиск icinga_customvariables. * 1047. * = '123456' И varname = NAME_IM_SEARCHING. Если результатов НЕТ, то добавленный столбец должен быть UNKNOWN, в противном случае добавленный столбец должен быть = icinga_customvariables. varvalue.

Как его добавить? : -)

1 Ответ

0 голосов
/ 29 апреля 2020

Вы можете поместить свой запрос в «табличное выражение», чтобы было проще присоединить его к other_table. Например:

select
  q.*,
  coalesce(o.varvalue, 'UNKNOWN') as city
from (
  -- your existing query here
) q
left join other_table o on o.object_id = q.object_id and o.varname = 'city'

РЕДАКТИРОВАТЬ: Объединение несколько раз

По запросу, если вам нужно извлечь больше названий городов, используя другой столбец, или если вы хотите извлечь против еще одну таблицу, вы можете добавить дополнительные LEFT JOIN. Например:

select
  q.*,
  coalesce(o.varvalue, 'UNKNOWN') as city,
  coalesce(o2.varvalue, 'UNKNOWN') as lake
from (
  -- your existing query here
) q
left join other_table o on o.object_id = q.object_id and o.varname = 'city'
left join other_table o2 on o.object_id = q.object_id and o2.varname = 'lake'
...