2011-05-16 55 views
1

这个声明有什么问题?我收到以下错误:SQL UNION与订单

Msg 156,Level 15,State 1,Line 4 关键字'ORDER'附近的语法不正确。

Msg 156,Level 15,State 1,Line 9 关键字'ORDER'附近的语法错误。

(SELECT TOP 1 dbo.ZERORATES.Maturity_Date AS Date1, dbo.ZERORATES.Zero_Rate AS Rate1 
    FROM dbo.ZERORATES 
    WHERE dbo.ZERORATES.Maturity_Date < '2013-05-16' 
    ORDER BY dbo.ZERORATES.Maturity_Date DESC) 
UNION 
(SELECT TOP 1 dbo.ZERORATES.Maturity_Date AS Date2, dbo.ZERORATES.Zero_Rate AS Rate2 
    FROM dbo.ZERORATES 
    WHERE dbo.ZERORATES.Maturity_Date > '2013-05-16' 
    ORDER BY dbo.ZERORATES.Maturity_Date ASC) 
+0

它是Transact-SQL? – heximal 2011-05-16 10:49:05

+0

我正在使用SQL Server – Michael 2011-05-16 10:50:13

+0

您想要第一个和最后一个到期日的值,您可以使用MIN和MAX函数来检索这些值。 – 2011-05-16 10:55:53

回答

7

尝试嵌入您的疑问在选择

select * from 
(SELECT TOP 1 dbo.ZERORATES.Maturity_Date AS Date1, dbo.ZERORATES.Zero_Rate AS Rate1 
    FROM dbo.ZERORATES 
    WHERE dbo.ZERORATES.Maturity_Date < '2013-05-16' 
    ORDER BY dbo.ZERORATES.Maturity_Date DESC) as T 
UNION 
select * from 
(SELECT TOP 1 dbo.ZERORATES.Maturity_Date AS Date2, dbo.ZERORATES.Zero_Rate AS Rate2 
    FROM dbo.ZERORATES 
    WHERE dbo.ZERORATES.Maturity_Date > '2013-05-16' 
    ORDER BY dbo.ZERORATES.Maturity_Date ASC) as T 
+0

谢谢Mikael,那正是我所需要的 – Michael 2011-05-16 11:03:28

1

一个工会只能有一个ORDER BY应该只在最后还可以选择,一个子查询只能有1列,将其更改为以下:

SELECT TOP 1 dbo.ZERORATES.Maturity_Date AS Date1, dbo.ZERORATES.Zero_Rate AS Rate1 
    INTO #Temp1 
FROM dbo.ZERORATES  
WHERE dbo.ZERORATES.Maturity_Date < '2013-05-16' 
ORDER BY dbo.ZERORATES.Maturity_Date DESC 
UNION 
SELECT TOP 1 dbo.ZERORATES.Maturity_Date AS Date1, dbo.ZERORATES.Zero_Rate AS Rate1 
    INTO #Temp2  
FROM dbo.ZERORATES  
WHERE dbo.ZERORATES.Maturity_Date > '2013-05-16'  
ORDER BY dbo.ZERORATES.Maturity_Date ASC 

SELECT * FROM #Temp1 
UNION 
SELECT * FROM #Temp2 
+0

这不会做我想要的。我需要距离那里最近的那两天。该表述给出表中的第一个日期和第一个日期,大于指定的日期。 – Michael 2011-05-16 10:51:31

+0

@Michael:如果您需要距离指定的那两天最近的日子,那么您的原始查询是错误的。 – 2011-05-16 10:54:25

+0

如果你想要从上方离下方最近,那么就OK。 – 2011-05-16 10:57:12

0

ORDER BY是无效视图编辑(只在SQLServer中)除非SELECT TOP被指定为/EDIT。尝试在加入表格后订购结果集。

0

UNION只能有一个ORDER,让顶部和底部值可以使用MIN和MAX

SELECT MAX(dbo.ZERORATES.Maturity_Date) AS Date, dbo.ZERORATES.Zero_Rate AS Rate 
FROM dbo.ZERORATES 
WHERE dbo.ZERORATES.Maturity_Date < '2013-05-16' 
GROUP BY dbo.ZERORATES.Zero_Rate 

UNION 

SELECT MIN(dbo.ZERORATES.Maturity_Date) AS Date, dbo.ZERORATES.Zero_Rate AS Rate 
FROM dbo.ZERORATES 
WHERE dbo.ZERORATES.Maturity_Date > '2013-05-16' 
GROUP BY dbo.ZERORATES.Zero_Rate 
+0

刚才上面的想法不适用于多个零率,可能会帮助您找到答案。也许TOP 1除了这个... – 2011-05-16 10:54:07

0

如果没有超过1排,每日期,这将做到:

SELECT z.Maturity_Date AS Date 
    , z.Zero_Rate AS Rate 
FROM 
    dbo.ZERORATES z 
     JOIN 
     ( SELECT MAX(dbo.ZERORATES.Maturity_Date) AS D 
      FROM dbo.ZERORATES 
      WHERE dbo.ZERORATES.Maturity_Date < '2013-05-16' 
     UNION 
      SELECT MIN(dbo.ZERORATES.Maturity_Date) AS D 
      FROM dbo.ZERORATES 
      WHERE dbo.ZERORATES.Maturity_Date > '2013-05-16' 
     ) 
    AS maxmin 
     ON z.Maturity_Date = maxmin.D 

我敢肯定有使用一个更优雅的解决方案和PARTITION BY但我现在不在SQL-Server附近检查。