Advantage 数据库服务器 ORDER BY 行为
Posted
技术标签:
【中文标题】Advantage 数据库服务器 ORDER BY 行为【英文标题】:Advantage Database Server ORDER BY behaviour 【发布时间】:2010-04-26 12:07:08 【问题描述】:我正在使用 ADS v10 测试版。我正在尝试计算有序结果集。
1) 嵌套查询中的 ORDER BY。我需要使用嵌套 SELECT 进行一些计算:
SELECT Name, Value, ROWNUM() FROM (SELECT * FROM MainTable WHERE Value > 0 ORDER BY Value) a
我得到了
未找到预期的词法元素:) 解析表格时出现问题 FROM 关键字后的名称 选择语句。
删除 ORDER BY 后一切正常。虽然,我在帮助中找到了示例,但它看起来像我的查询(确实更复杂):
SELECT * FROM (SELECT TOP 10 empid, fullname FROM branch1 ORDER BY empid) a UNION SELECT empid, fullname FROM branch2 ORDER BY empid
2) ORDER BY
+ ROWNUM()
。我在上面的示例中使用了嵌套查询来计算有序行。有没有机会避免嵌套查询?
在 SQL Server 中,我可以这样做:
SELECT Name, Value, ROW_NUMBER() OVER(ORDER BY Value) FROM MainTable WHERE Value > 1 ORDER BY Value
请指教。 谢谢。
【问题讨论】:
【参考方案1】:我认为您需要将 ORDER BY 移到子查询之外:
SELECT Name, Value, ROWNUM() FROM
(SELECT * FROM MainTable WHERE Value > 0 ) a ORDER BY Value
如果您希望将 rownum() 应用于有序结果集(我今天早上有点慢),那么可能需要使用类似以下内容:
SELECT Name, Value, ROWNUM() FROM
(SELECT top 100 PERCENT * FROM MainTable WHERE Value > 0 order by value ) a
我不认为子查询中的 ORDER BY 是允许的,除非它实际上改变了结果......但是在这种情况下,它似乎应该被允许。
【讨论】:
您的建议可以简化为“SELECT Name, Value, ROWNUM() FROM MainTable WHERE Value > 0 ORDER BY Value”不是吗?在我问题的第二个“2)”部分中,我写了为什么它不起作用。 @ie:是的,它相当于那个查询。但是,我认为不支持 OVER 子句(在第二个查询中)。 @Mark Wilkins:至于TOP 100 PERCENT,你不觉得这样的需求看起来像个bug吗?我的意思是我希望以任何方式查看所有 100% 的记录。 @ie:我同意在这种情况下使用 TOP 是非常人为的。你能澄清一下在这种情况下你想用 ROWNUM() 做什么吗?是否需要应用于有序结果集? @Mark Wilkins:这是一个非常特殊的情况,我需要将一个有序的记录集分成两部分——一个是奇数,另一个是偶数。然后我需要和他们做一些计算。为了简化这一点,假设我需要对有序记录集中的第一条和第二条记录、第三条和第四条等执行操作。使用 rownum 并不是唯一的方法,但我正在尝试这个。谢谢。【参考方案2】:在您的陈述中使用别名使其更清晰,并可能解决问题。
而不是:
SELECT Name, Value, ROWNUM()
FROM (SELECT * FROM MainTable WHERE Value > 0 ORDER BY Value) a
使用
SELECT a.Name, a.Value, ROWNUM()
FROM (SELECT mt.* FROM MainTable mt WHERE mt.Value > 0 ORDER BY mt.Value) a
问题可能是它混淆了order by
子句中的字段value
——它不知道从哪个表中获取它,第一个还是第二个。
【讨论】:
第一还是第二?为什么?我只使用一张桌子。 自从我回答后,您的问题似乎发生了巨大变化。但是在您的原始查询中,'a' 是一组记录,而 maintable 是另一组记录。 抱歉,我不确定你在说什么。以上是关于Advantage 数据库服务器 ORDER BY 行为的主要内容,如果未能解决你的问题,请参考以下文章
Advantage 和 PHP - 错误 6303:超过最大 Advantage 数据库服务器连接数
mysql order by rand() 性能问题及解决方案