Преобразование подзапроса в объединение для создания представления

У меня есть вложенный SQL-запрос:

SELECT * 
FROM
(
    SELECT *
    FROM asset_status
    ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id

Я хотел бы создать представление из этого запроса, но MySQL, похоже, не разрешает подзапросы в представлениях. Как можно преобразовать это в соединение?


person arjunurs    schedule 13.02.2012    source источник
comment
Что представляют собой столбцы в assets_status?   -  person aF.    schedule 13.02.2012


Ответы (3)


SQL Server разрешает подзапросы в представлениях. Чего вы не можете сделать, так это SELECT * и GROUP BY a, b

Вы пробовали... (Я предполагаю, что это не весь ваш запрос, поэтому я внесу минимально возможные изменения)

SELECT asset_id, workflow_element_id
FROM
(
    SELECT *
    FROM asset_status
    -- ORDER BY session_id DESC   (Removed as innefective in a view)
) tmp
GROUP BY asset_id, workflow_element_id


Кроме того, обратите внимание, что ORDER BY во внутреннем запросе неэффективен (и, возможно, даже запрещен), так как внешний запрос затем может переупорядочить его (он не будет всегда возвращаться в в другом порядке, но этот макет не гарантирует желаемый порядок). Даже во внешнем запросе это может привести к упорядочению результатов при использовании представления, но опять же оптимизатору разрешено переупорядочивать результаты. Если ORDER BY не находится в запросе, использующем представление, порядок никогда не абсолютно гарантирован...

SELECT * FROM view ORDER BY x


Наконец, вы пометили это как вопрос LEFT JOIN. Если у вас есть более полный пример кода, я уверен, что кто-то предложит альтернативный макет. Но я уезжаю на несколько дней. Удачи! :)

person MatBailie    schedule 13.02.2012
comment
Это MySQL, а не SQLServer. - person ; 13.02.2012

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

SELECT DISTINCT asset_id, workflow_element_id
FROM asset_status

Если вам нужно сделать заказ на session_id, вы должны будете включить его в совокупность, например, max. (или в группе по)

SELECT asset_id, workflow_element_id
FROM asset_status
GROUP BY asset_id, workflow_element_id
ORDER BY MAX(session_id) DESC
person Magnus    schedule 13.02.2012
comment
Я добавил подзапрос только для порядка. Поскольку вы говорите, что порядок не гарантируется, я попробую агрегат max - person arjunurs; 13.02.2012

Согласно справочному руководству MySQL, вы можете создавать представления которые используют подзапросы, но не в предложении From.

Поэтому я думаю, вам нужно создать свое представление следующим образом:

select a.* 
from asset_status a
join (select asset_id, workflow_element_id, MAX(session_id) session_id
      from asset_status
      group by asset_id, workflow_element_id) sq
  on a.session_id = sq.session_id

Однако он, вероятно, не будет работать так же хорошо, как ваш исходный запрос.

person Community    schedule 13.02.2012
comment
Как ваш запрос обрабатывает порядок сортировки session_id? Этот запрос не возвращает ожидаемые записи. Я пытаюсь получить статус актива для разных рабочих процессов. Эти результаты должны быть из последней сессии. - person arjunurs; 13.02.2012
comment
@apurv: ваш исходный запрос, по-видимому, был разработан для возврата самой последней записи assets_status (т. е. с самым высоким session_id) для каждой комбинации assets_id и workflow_element_id. Использование max(session_id) в сочетании с группировкой должно выбирать наивысший идентификатор session_id для каждой комбинации assets_id и workflow_element_id. Чем результаты этого запроса отличаются от ожидаемых результатов? Можете ли вы включить некоторые образцы данных в свой вопрос? - person ; 13.02.2012