2016-07-22 2 views
2

Я нашел, что при использовании порядка непосредственно, это нормально."ORDER BY" в подзапросе - не доступен в MonetDB?

SELECT t0."D" AS fd, 
    SUM(t0."SD") AS top 
FROM "mock_table_1" AS t0 
GROUP BY t0."D" 
ORDER BY top ASC 
LIMIT 10 

, но при использовании его в подзапросе сообщается о синтаксической ошибке.

SELECT * FROM (
    SELECT t0."D" AS fd, 
    SUM(t0."SD") AS top 
    FROM "mock_table_1" AS t0 
    GROUP BY t0."D" 
    ORDER BY top ASC 
    LIMIT 10 
) 

вот сообщение об ошибке.

syntax error, unexpected ORDER, expecting UNION or EXCEPT or INTERSECT or ')' in: "select t0."A" as d0, 

Итак, интересно ли, что monetdb предназначен для того, чтобы быть таким, или это ошибка?

ответ

1

SQL соответствующих требования DBMSes не должна позволять ORDER BY в подзапросах, потому что это противоречит концептуальной модели реляционной СУБД. См:

Is order by clause allowed in a subquery

для деталей. Однако путь вокруг этого заключается в использовании функций окна, которые MonetDB does support. В частности, в вашем подзапрос, а не, скажем,

SELECT c1 FROM t1; 

вы можете

SELECT c1, ROW_NUMBER() OVER() as rownum from t1; 

и теперь у вас есть относительный порядок внутреннего результата запроса, доступной для внешнего запроса.