【问题标题】:SQL Oracle to SQL ServerSQL Oracle 到 SQL Server
【发布时间】:2018-07-11 12:05:21
【问题描述】:

此查询在 Oracle 中有效:

SELECT EXTRACT(YEAR FROM "DATE_OF_PUBLICATION") AS years,  
       Count("LOSS_AMOUNT_(LOCAL_CCY)") AS events,   
       Max("LOSS_AMOUNT_(LOCAL_CCY)") AS max_losses, 
       Sum("LOSS_AMOUNT_(LOCAL_CCY)") AS sum_losses 
FROM (
  select * 
  from (
     select "DATE_OF_PUBLICATION",
            "LOSS_AMOUNT_(LOCAL_CCY)" 
     FROM TEST 
     ORDER BY "LOSS_AMOUNT_(LOCAL_CCY)" DESC 
  )
) 
GROUP BY EXTRACT(YEAR FROM "DATE_OF_PUBLICATION") 
ORDER BY EXTRACT(YEAR FROM "DATE_OF_PUBLICATION")

现在,我在 SQLServer 中执行了这个查询:

SELECT DATEPART(YEAR,"DATE_OF_PUBLICATION") AS years, 
       Count("LOSS_AMOUNT_(LOCAL_CCY)") AS events,   
       Max("LOSS_AMOUNT_(LOCAL_CCY)") AS max_losses, 
       sum("LOSS_AMOUNT_(LOCAL_CCY)") AS sum_losses 
FROM (
  select * 
  from (
    select "DATE_OF_PUBLICATION",
           "LOSS_AMOUNT_(LOCAL_CCY)" 
    FROM TEST 
    ORDER BY "LOSS_AMOUNT_(LOCAL_CCY)" DESC 
  )
) 
GROUP BY DATEPART (YEAR ,"DATE_OF_PUBLICATION") 
ORDER BY DATEPART(YEAR ,"DATE_OF_PUBLICATION")

我收到此错误:

The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and 
common table expressions, unless TOP, OFFSET or FOR XML is also specified.

【问题讨论】:

    标签: sql sql-server oracle tsql


    【解决方案1】:

    正如错误明确指出的那样,ORDER BY 在子查询中无效。

    另外:在 SQL server 中,当你使用子查询时,它必须有一个名字:

    select * from ( select .....) 
    

    无效,而

    select * from ( select .....) as tablename
    

    有效

    此外,您还有两个不必要的子查询级别。 以下应该有效:

    SELECT 
        DATEPART(YEAR , "DATE_OF_PUBLICATION") AS years, 
        Count("LOSS_AMOUNT_(LOCAL_CCY)") AS events, 
        Max("LOSS_AMOUNT_(LOCAL_CCY)") AS max_losses, 
        Sum("LOSS_AMOUNT_(LOCAL_CCY)") AS sum_losses 
    FROM AAA_20180711
    GROUP BY DATEPART(YEAR , "DATE_OF_PUBLICATION") 
    ORDER BY DATEPART(YEAR, "DATE_OF_PUBLICATION") 
    

    【讨论】:

    • SELECT DATEPART(YEAR , "DATE_OF_PUBLICATION") AS 年份,Count("LOSS_AMOUNT_(LOCAL_CCY)") AS 事件,Max("LOSS_AMOUNT_(LOCAL_CCY)") AS max_losses,Sum("LOSS_AMOUNT_(LOCAL_CCY) )") AS sum_losses FROM (select * from(select "DATE_OF_PUBLICATION","LOSS_AMOUNT_(LOCAL_CCY)" FROM Test)) GROUP BY DATEPART(YEAR , "DATE_OF_PUBLICATION") ORDER BY DATEPART(YEAR, "DATE_OF_PUBLICATION")
    • 相应地更新了答案
    • 非常感谢,祝您有美好的一天!
    【解决方案2】:

    根本不需要内部的order by。虽然 Oracle 容忍它(并且可能只是忽略它),但 SQL Server 不喜欢它(这是理所当然的)。您可以将其从查询中完全删除。唯一需要的是外部order by。另外:也不需要嵌套派生表。

    您可以将查询简化为:

    SELECT DATEPART(YEAR,"DATE_OF_PUBLICATION") AS years, 
           Count("LOSS_AMOUNT_(LOCAL_CCY)") AS events,   
           Max("LOSS_AMOUNT_(LOCAL_CCY)") AS max_losses, 
           sum("LOSS_AMOUNT_(LOCAL_CCY)") AS sum_losses 
    FROM TEST 
    GROUP BY DATEPART(YEAR ,"DATE_OF_PUBLICATION") 
    ORDER BY DATEPART(YEAR ,"DATE_OF_PUBLICATION")
    

    【讨论】:

      【解决方案3】:

      删除Order by 子句,不要忘记在嵌套查询中添加alias

      修改后使用下一个查询:-

      SELECT DATEPART(YEAR,"DATE_OF_PUBLICATION") AS years, 
             Count("LOSS_AMOUNT_(LOCAL_CCY)") AS events,   
             Max("LOSS_AMOUNT_(LOCAL_CCY)") AS max_losses, 
             sum("LOSS_AMOUNT_(LOCAL_CCY)") AS sum_losses 
      FROM (
        select * 
        from (
          select "DATE_OF_PUBLICATION",
                 "LOSS_AMOUNT_(LOCAL_CCY)" 
          FROM TEST 
        )t1
      ) t2 
      GROUP BY DATEPART (YEAR ,"DATE_OF_PUBLICATION") 
      ORDER BY DATEPART(YEAR ,"DATE_OF_PUBLICATION")
      

      【讨论】:

        【解决方案4】:

        如果你使用,你也可以保持顺序

        SELECT TOP 100 PERCENT * FROM ...
        

        在您的子查询中。

        然而,“错误”指出一般情况下,子查询不应该需要 ORDER BY 子句。考虑一下为什么你觉得你需要 ORDER BY,你可能可以安全地删除它

        【讨论】:

          猜你喜欢
          • 2021-05-20
          • 2014-08-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-04-17
          • 2015-08-24
          • 2011-06-17
          相关资源
          最近更新 更多