将子查询转换为连接以创建视图

时间:2012-02-13 16:51:23

标签: mysql sql subquery nested-queries

我有一个嵌套的SQL查询:

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

我想从这个查询创建一个视图,但MySQL似乎不允许视图中的子查询。如何将其转换为连接?

3 个答案:

答案 0 :(得分:2)

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是无效的(甚至可能是不允许的),因为允许外部查询对其进行重新排序(它不会总是以不同的顺序返回,但这种布局不是 guarnatee 你想要的顺序)。即使在外部查询中,可能会导致您在使用视图时对结果进行排序,但同样允许优化程序重新排序结果。除非ORDER BY在使用视图的查询中,否则订单永远不会绝对保证 ......

SELECT * FROM view ORDER BY x


最后,您将此标记为LEFT JOIN问题。如果你有一个更完整的代码示例,我相信有人会建议一个替代布局。但是我现在已经退出了几天。祝好运! :)

答案 1 :(得分:0)

不需要子查询,因为根本不保证使用内部顺序。你可以写:

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

答案 2 :(得分:0)

根据the MySQL reference manual,您可以创建使用子查询的视图,但不能创建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

但是,它可能无法与原始查询一样好。