2011-05-16 57 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附近檢查。