Почему мы не можем использовать UNION ALL и ORDER BY вместе в SQL

#sql

#sql

Вопрос:

 SELECT TOP 1 LEN(CITY),CITY
    FROM STATION
    ORDER BY LEN(CITY),CITY;
    UNION ALL
    SELECT TOP 1 LEN(CITY),CIYT
    FROM STATION
    ORDER BY LEN(CITY) DESC,CITY DESC;
  

Комментарии:

1. Я удалил в неподходящих тегах базы данных. Пожалуйста, помечайте только ту базу данных, которую вы действительно используете.

2. ORDER BY идет в конце всех ваших инструкций. Также вы завершаете свою инструкцию и начинаете новую с UNION ALL .

3. Как сказал @Lamu, но завершается из-за точки с запятой перед UNION ALL

4. @GordonLinoff, спасибо, что указали на ошибки… Я буду иметь их в виду в следующий раз

Ответ №1:

ORDER BY , когда использование UNION ALL выполняется в конце всего оператора, а не в конце каждого из них. У вас также есть оператор terminator ( ; ) после вашего первого запроса, что означает, что у вас есть SELECT TOP(1) запрос, за которым следует следующий запрос, начинающийся с UNION ALL .

Вам нужно использовать подзапросы здесь, а затем UNION те:

 SELECT *
FROM (SELECT TOP (1) LEN(CITY) AS CITYLEN, CITY
      FROM STATION
      ORDER BY LEN(CITY),CITY) S
UNION ALL
SELECT *
FROM (SELECT TOP (1) LEN(CITY) AS CITYLEN, CITY
      FROM STATION
      ORDER BY LEN(CITY) DESC,CITY DESC) S
  

Ответ №2:

Предполагая, что ваша база данных поддерживает TOP (чего нет у большинства исходных тегов), вы можете использовать подзапрос:

 SELECT c.*
FROM ((SELECT TOP (1) LEN(CITY) AS LEN, CITY
       FROM STATION
       ORDER BY LEN(CITY), CITY
      ) UNION ALL
      (SELECT TOP (1) LEN(CITY), CITY
       FROM STATION
       ORDER BY LEN(CITY) DESC, CITY DESC
      )
     ) c;
  

Конечно, точки с запятой также не допускаются в середине запроса, так что это еще одна проблема с вашим запросом.

Комментарии:

1. Здесь возникает та же проблема, что и в моем запросе изначально, вам нужно присвоить псевдонимы столбцам в подзапросах, иначе вы получите сообщение об ошибке.