Запрос Oracle DISTINCT с ORDER BY в поле не требуется в наборе результатов - PullRequest
1 голос
/ 10 марта 2019

У меня есть такие данные в таблице Oracle под названием NAMES

| id | name    | language | language_id |
| 1  | Paul    | English  | 4           |
| 1  | Pablo   | Spanish  | 10          |
| 2  | Richard | English  | 4           |

Мне нужен SQL-запрос, который будет сортировать по имени, но запрос не должен возвращать фактическое имя, только правильный порядок ... Проблема в том, что мне также нужен отдельный список идентификаторов

если я сделаю следующий SQL:

SELECT DISTINCT
   ID 
FROM 
   NAMES
WHERE
   language_id in (4,10)
ORDER BY NAME

Результат в oracle:

| id | 
| 1  | 
| 1  |
| 2  |

Я бы хотел, чтобы был возвращен только один результат, который НЕ предоставляется отличным в этом сценарии, так как имя, включенное в предложение order by, дублируется, поэтому Oracle возвращает оба - я понимаю это, потому что если есть был больший список имен, в которых Пол и Пабло появлялись в разных позициях в порядке, поэтому не знали, какое из них удалить в отдельном

Вопрос в том, как указать идентификатор предпочтительного языка в запросе sql, который бы возвращал запись с идентификатором предпочтительного языка, в случае, если для одного и того же идентификатора имеется несколько результатов?

Так что для этого примера желаемый запрос вернет:

| id | 
| 1  |
| 2  | 

Ответы [ 4 ]

3 голосов
/ 10 марта 2019

Боюсь, вы ошиблись.Первый написанный вами запрос не вернет что-либо , он недопустим (вы не можете упорядочить по столбцу, который не является частью списка столбцов выбора, если вы используете DISTINCT или агрегаты):

SQL> with names (id, name, language_id) as
  2    (select 1, 'paul'   ,  4 from dual union all
  3     select 1, 'pablo'  , 10 from dual union all
  4     select 2, 'richard',  4 from dual
  5    )
  6  select distinct id
  7  from names
  8  where language_id In (4, 10)
  9  order by name;
order by name
         *
ERROR at line 9:
ORA-01791: not a SELECTed expression


SQL>

Почему вы заботитесь о NAME и хотите отсортировать результат по нему?Что это меняет?Почему бы просто не

SQL> with names (id, name, language_id) as
  2    (select 1, 'paul'   ,  4 from dual union all
  3     select 1, 'pablo'  , 10 from dual union all
  4     select 2, 'richard',  4 from dual
  5    )
  6  select distinct id
  7  from names
  8  where language_id In (4, 10);

        ID
----------
         1
         2

SQL>

[РЕДАКТИРОВАТЬ]

Посмотрите, поможет ли это;Сначала агрегируйте (что означает, что вы все равно получите значения DISTINCT), затем сортируйте по MIN_NAME:

SQL> with names (id, name, language_id) as
  2    (select 1, 'paul'   ,  4 from dual union all
  3     select 1, 'pablo'  , 10 from dual union all
  4     select 2, 'richard',  4 from dual
  5    ),
  6  inter as
  7    (select id, min(name) min_name
  8     from names
  9     where language_id in (4, 10)
 10     group by id
 11    )
 12  select id
 13  from inter
 14  order by min_name;

        ID
----------
         1
         2

SQL>
1 голос
/ 10 марта 2019

Понятия не имею, почему ваш первый запрос вернул бы три строки 1, 1 и 2. Это просто не произойдет. Как указывает @Littlefoot, он не будет выполняться так, как написано, потому что вы не можете упорядочить по столбцу, который вы не выбрали. Во-вторых, если вы устраните недействительный ORDER BY:

SELECT DISTINCT ID 
FROM NAMES
WHERE language_id in (4,10)

это будет возврат

ID
2
1

dbfiddle здесь .

0 голосов
/ 10 марта 2019

Вы можете использовать GROUP BY, но вам нужно решить , какое назвать до ORDER BY.Например:

SELECT ID 
FROM NAMES
WHERE language_id in (4, 10)
ORDER BY MIN(NAME);

Аааа.,,Ваш вопрос требует сделать это по идентификатору языка.Вот простой метод:

SELECT ID 
FROM NAMES
WHERE language_id in (4, 10)
ORDER BY COALESCE(MAX(CASE WHEN language_id = 4 THEN NAME END),
                  MAX(CASE WHEN language_id = 10 THEN NAME END)
                 )

Если существует язык "4", то он используется, иначе 10.

0 голосов
/ 10 марта 2019

Я попробовал следующее и работал для записей, которые я вставил. Я также добавил ссылку SQL Fiddle:

http://sqlfiddle.com/#!4/24679a/2

select distinct id 
from (
      SELECT id,name
      FROM NAMES
      WHERE language_id in (4,10,11)
      ORDER BY NAME
     ) tmp
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...