我有一个嵌套的SQL查询:
SELECT *
FROM
(
SELECT *
FROM asset_status
ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id
我想从这个查询创建一个视图,但MySQL似乎不允许视图中的子查询。如何将其转换为连接?
答案 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
但是,它可能无法与原始查询一样好。