【问题标题】:Emulate group by, order by, limit from mysql to ms sql 2000模拟 group by,order by,从 mysql 到 ms sql 2000 的限制
【发布时间】:2011-12-15 14:46:35
【问题描述】:

我在 MySQL 中有一个查询:

select slscod,slsname,brc
from td_casa
group by slscod
order by slsname
limit 0,100

此查询检索具有slsnamebrc 的前100 个唯一销售代码,按slsname 升序排列。

如何在 MSSQL 2000 中更改此查询?

【问题讨论】:

  • 你试过在 SQL Server 上运行它吗?它是否返回任何错误消息?
  • @a'r:这不是很明显的有效 SQL Server 语法。这就是为什么有人问这个问题......

标签: mysql sql sql-server group-by sql-order-by


【解决方案1】:

基本语法是:

select top 100 slscod,slsname,brc 
from td_casa 
group by slscod 
order by slsname

【讨论】:

  • 不起作用,我收到一个错误:[Err] 42000 - [SQL Server]Column 'td_casa.slsname' 在选择列表中无效,因为它既不包含在聚合函数中,也不包含在GROUP BY 子句。
【解决方案2】:
SELECT TOP 100 slscod, slsname, brc
FROM td_casa
GROUP BY slscod, slsname, brc
ORDER BY slsname

注意:关于您对 Column 'xyz' 在 select ... 错误中的评论无效,我注意到您选择了 3 列,但在 GROUP BY 子句中指定了 1 列。这是here 所述的 MySQL 特定行为:

MySQL 扩展了 GROUP BY 的使用以允许选择以下字段 GROUP BY 子句中未提及。如果你没有得到 您期望从查询中得到的结果,请阅读说明 第 11.15 节“使用的函数和修饰符”中的 GROUP BY 带有 GROUP BY 子句”。

【讨论】:

【解决方案3】:

因为在 MSSQL 2000 中不支持 ROW_NUMBER()LIMIT ... OFFSET .. 最后,我找到了这个查询:

SELECT slscod, MIN(slsname) slsname, MIN(brc) brc FROM (
    SELECT top 30 slscod, MIN(slsname) slsname, MIN(brc) brc FROM
    (
        SELECT TOP (1*30) slscod, MIN(slsname) slsname, MIN(brc) brc
        FROM td_casa group by slscod
        ORDER BY slsname ASC
    ) AS t1 group by slscod
     ORDER BY slsname DESC ) AS t2 group by slscod ORDER BY MIN(slsname) ASC

如果在mysql中也是这样:

select slscod,slsname,brc from td_casa group by slscod order by slsname limit 0,30

如果您更改TOP (2*30),这将是相同的limit 30,30TOP (3*30) 这是相同的limit 60,30 等等。

迫切需要努力。 谢谢大家。让我们干杯

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 1970-01-01
    • 2012-05-06
    相关资源
    最近更新 更多