Заказать внутри подзапроса - PullRequest
2 голосов
/ 20 июля 2011
SELECT u.id
FROM user u
WHERE u.id IN 
((SELECT l.id FROM location l WHERE l.id = ?id ORDER BY l.idLocation DESC )) 

То, что я хочу сделать, это сделать этот заказ по работе.Но не возможно иметь заказ в представлении.Как я могу сделать этот порядок, если не внутри представления?

Ответ SQL:

Сообщение 1033, уровень 15, состояние 1, строка 5 ЗАКАЗПредложение BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если также не указан TOP или FOR XML.

Ответы [ 4 ]

7 голосов
/ 20 июля 2011

Здесь есть два вопроса.

1 - Ваш ORDER BY не имеет смысла. Когда вы используете подзапрос IN, ORDER не имеет значения.

2 - ORDER BY для представления должно быть в вызывающем запросе, а не в самом представлении.

6 голосов
/ 20 июля 2011

Вы не можете.Только крайний ORDER BY имеет значение.

Таким образом, SELECT * FROM MyView ORDER By Whatever является только способом.

Любое промежуточное упорядочение (будь то ORDER BY или совпадение,или часть локальной сети) игнорируется

1 голос
/ 20 июля 2011

Нет необходимости использовать ORDER BY в подзапросе.

Если вы хотите добавить ORDER BY к представлению, вы можете добавить TOP(100) PERCENT к своему представлению, а затем использовать его.

http://cf -bill.blogspot.com / 2007/01 / SQL-сервер заказ view.html

0 голосов
/ 21 июля 2011

Я разделяю мнение с предыдущими ответами о том, что вообще не стоит делать order by в подзапросе. Однако я обнаружил, что иногда это очень полезно. Я предполагаю, что пример запроса в pringlesinn является простым примером более сложного требования. Вы можете сделать order by в подзапросе следующим образом:

SELECT u.id
FROM user u
WHERE exists
(SELECT ROW_NUMBER() OVER (ORDER BY l.idLocation DESC) FROM location l WHERE u.id = l.id and l.id = ?id) 

Однако вы заметите, что в предложении WHERE больше не используется оператор IN. Вместо этого вы должны использовать «EXISTS» и выполнить коррелированный подзапрос. Или вы могли бы сделать что-то вроде этого:

SELECT u.id
FROM user u inner join 
  (
    SELECT ROW_NUMBER() OVER (ORDER BY l.idLocation DESC) as rowid, l.id 
    FROM location l 
    WHERE l.id = ?id
  ) as z on z.id = u.id

С наилучшими пожеланиями, Джеймс

...