Преобразование подзапроса для объединения для создания представления - PullRequest
3 голосов
/ 13 февраля 2012

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

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

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

Ответы [ 3 ]

2 голосов
/ 13 февраля 2012

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


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

0 голосов
/ 13 февраля 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

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

0 голосов
/ 13 февраля 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
...