我有一个嵌套的 SQL 查询:
SELECT *
FROM
(
SELECT *
FROM asset_status
ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id
我想从此查询创建一个视图,但 MySQL 似乎不允许视图中的子查询。如何将其转换为联接?
我有一个嵌套的 SQL 查询:
SELECT *
FROM
(
SELECT *
FROM asset_status
ORDER BY session_id DESC
) tmp
GROUP BY asset_id, workflow_element_id
我想从此查询创建一个视图,但 MySQL 似乎不允许视图中的子查询。如何将其转换为联接?
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 问题。如果您有更完整的代码示例,我相信有人会建议另一种布局。但是我现在要出去几天了。祝你好运!:)
不需要子查询,因为根本不保证使用内部 order by。你可以写:
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
根据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
但是,它的性能可能不如您的原始查询。