2012-02-13 53 views
3

我有一个嵌套的SQL查询:变换子查询,以便创建一个视图

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

我想创建从该查询视图,但MySQL的似乎并没有允许的意见子查询。如何将其转换为连接?

+1

asset_status的列是什么? – 2012-02-13 16:56:15

回答

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在内部查询innefective(甚至可能DIS-允许),为外部查询,然后允许重新排序(它不会总是回来不同的顺序,但这个布局不是guarnatee你似乎想要的顺序)。即使在外部查询中,可能会导致您的结果在使用视图时成为顺序,但是再次允许优化程序重新排序结果。除非ORDER BY是在查询中使用视图,顺序是从未绝对保证 ...

SELECT * FROM view ORDER BY x 


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

+0

+1确实..那个查询是不正确的! – 2012-02-13 16:57:32

+2

这是MySQL,而不是SQLServer。 – 2012-02-13 17:52:28

+0

糟糕,我的错误,道歉 – MatBailie 2012-02-14 05:49:14

0

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

SELECT DISTINCT asset_id, workflow_element_id 
FROM asset_status 

如果需要通过session_id订购你就必须把它列入聚集,max例如。 (或者在group by)

SELECT asset_id, workflow_element_id 
FROM asset_status 
GROUP BY asset_id, workflow_element_id 
ORDER BY MAX(session_id) DESC 
+0

我只为了order by而添加了子查询。既然你说的顺序是不能保证的,我会尝试聚合'max' – arjunurs 2012-02-13 18:29:53

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 

但是,它可能不会为你的原始查询执行为好。

+0

你的查询如何处理session_id的排序顺序?此查询不会返回预期的记录。我正在尝试检索不同工作流程的资产状态。这些结果需要来自最近的会议。 – arjunurs 2012-02-13 18:36:12

+0

@apurv:您的原始查询似乎已设计为为asset_id和workflow_element_id的每个组合返回最近的asset_status记录(即具有最高的session_id)。使用max(session_id)并结合分组,应该为每个asset_id和workflow_element_id的组合选择最高的session_id。这个查询的结果与预期的结果有什么不同?你能否在你的问题中包含一些样本数据? – 2012-02-13 18:50:48