Oracle SQL order by не упорядочивает несколько столбцов - PullRequest
0 голосов
/ 12 февраля 2019

У меня есть таблица student, и я хочу отсортировать в ней три столбца: first_name, last_name, street_address.Я ожидаю такой результат:

| first_name | last_name | street_address |

     A            A        100 Carroll St
     B            B        200 Carroll St
     C            C        300 Carroll St

Это мой запрос SQL:

SELECT first_name, last_name, street_address
FROM student
ORDER BY first_name, last_name, street_address;

Но этот запрос сортируется так:

| first_name | last_name        | street_address            |

     A         C (not sorted)       300 Carroll St  (not sorted)
     B         B (not sorted)       100 Carroll St  (not sorted)
     C         A (not sorted)       200 Carroll St  (not sorted)

Этотзапрос не работает как положено.Он не сортирует все столбцы в порядке возрастания, он сортирует только первый столбец, который появляется после ORDER BY.Как упоминалось выше, запрос сортирует только столбец first_name.Если я поменяю местами столбцы после ORDER BY, он только сортирует первый упомянутый столбец после "ORDER_BY"

Я искал в Google и на многих форумах и не смог найти ничего, связанного с этой проблемой.

Версия Oracle:

Oracle Database 12c Enterprise Edition, выпуск 12.2.0.1.0 - 64-разрядная версия 0

PL / SQL, версия 12.2.0.1.0 - версия 0

CORE 12.2.0.1.0 Производство 0

TNS для 64-разрядных Windows: Версия 12.2.0.1.0 - Производство 0

NLSRTL Версия 12.2.0.1.0 - Производство 0

Буду признателен за вашу помощь.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Вот некоторые примеры входных данных, которые, я надеюсь, прояснят следующее объяснение:

id  | first_name | last_name    | street_address         
 10 | Albert     |  Camus       | 300 Carroll St 
 20 | Caroline   |  Aherne      | 200 Carroll St 
 30 | Bertoldt   |  Brecht      | 500 Carroll St  
 40 | Albert     |  Dumbledore  | 400 Carroll St 
 50 | Bertoldt   |  Brecht      | 100 Carroll St  

Здесь у нас есть пять записей , которые рассказывают нам полезные вещи, такие как Альберт Камюживет на 300 Кэрролл-стрит, а Кэролайн Ахерн живет на 200 Кэрролл-стрит. Важно понимать, что в SQL-запросе он получает записи;когда мы используем ORDER BY, он сортирует записи, а не отдельные столбцы.

Таким образом, когда мы сортируем эти записи по порядку first_name, last_name, street_address, мы получаем следующий результат:

id  | first_name | last_name    | street_address         
 10 | Albert     |  Camus       | 300 Carroll St 
 40 | Albert     |  Dumbledore  | 400 Carroll St 
 50 | Bertoldt   |  Brecht      | 100 Carroll St  
 30 | Bertoldt   |  Brecht      | 500 Carroll St 
 20 | Caroline   |  Aherne      | 200 Carroll St  

Результирующий набор - это записи таблицы, отсортированные в порядке first_name;когда две записи имеют одинаковое значение first_name, сортировка использует last_name для разрыва связи;когда first_name и last_name одинаковы, сортировка использует street_address.Это именно то, что мы ожидали.Записи остаются нетронутыми.

Что бы значило сортировать столбцы независимо?На 100 Кэрролл-стрит нет такого человека, как Альберт Ахерн.Так как бы SQL составил один?

Если вы все еще не можете понять, как это работает, обратите внимание, что я добавил суррогатный первичный ключ в таблицу.Столбец ID уникально идентифицирует каждую запись.Таким образом, ID = 30 идентифицирует Бертольдта Брехта, живущего по адресу: 500 Carroll Street. Предположим, что ORDER BY сработал так, как вы ожидаете: каким будет значение ID для Альберта Ахерна, живущего на 100 Carroll Street?1025 * В соответствии с формами нормализации в таблице все записи должны быть связаны с первичным ключом, и это означает, что вы не можете сортировать несколько столбцов, тогда зачем нам сортировать несколько столбцов?

Нормализация имеетничего общего с этим.Мы можем захотеть упорядочить по столбцам составного ключа или даже по неключевым атрибутам.В таких условиях нам часто нужно заказывать по нескольким столбцам.

Например, я тасую колоду карт.Теперь я прошу вас взять пять карт и положить их в порядке возрастания, тузы низкие.Достаточно просто.За исключением того, что вы нарисовали семерку пик и семерку сердец.Что приходит первым?Пики выше сердец, поэтому семь червей, а потом семь пиков.Но оба до девяти клубов.

0 голосов
/ 12 февраля 2019

Ваш запрос не даст указанных вами результатов.То, что вы получите, будет

A   A   100 Carroll St
B   B   200 Carroll St
C   C   300 Carroll St

, используя следующий запрос

WITH student AS (SELECT 'A' AS FIRST_NAME, 'A' AS LAST_NAME, '100 Carroll St' AS STREET_ADDRESS FROM DUAL UNION ALL
                 SELECT 'B', 'B', '200 Carroll St' FROM DUAL UNION ALL
                 SELECT 'C', 'C', '300 Carroll St' FROM DUAL)
SELECT first_name, last_name, street_address
FROM student
ORDER BY first_name, last_name, street_address

Я предлагаю вам вернуться и посмотреть на фактические данные в таблице, которые могут не соответствовать вашиможидается.

Удачи.

...