SQL UNION с ЗАКАЗОМ - PullRequest
       27

SQL UNION с ЗАКАЗОМ

1 голос
/ 16 мая 2011

Что не так с этим утверждением? Я получаю следующие ошибки:

Сообщение 156, Уровень 15, Состояние 1, Строка 4 Неверный синтаксис рядом с ключевым словом «ORDER».

Сообщение 156, Уровень 15, Состояние 1, Строка 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)

Ответы [ 5 ]

8 голосов
/ 16 мая 2011

Попробуйте встроить ваши запросы в выборку

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
1 голос
/ 16 мая 2011

У СОЮЗА может быть только один ордер, по которому должен быть только последний выбор, у подзапроса может быть только 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 голосов
/ 16 мая 2011

Если для каждой даты не более 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

Я уверен, что есть более элегантное решение с использованием OVER() и PARTITION BY, но я нерядом с SQL-сервером, чтобы проверить.

0 голосов
/ 16 мая 2011

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 голосов
/ 16 мая 2011

ORDER BY недопустим в представлениях EDIT (ТОЛЬКО в SQLServer) , если не указано SELECT TOP / EDIT. Попробуйте упорядочить набор результатов после объединения таблиц.

...