2016-09-01 5 views
0

Рассмотрим следующий пример:Oracle поведение неожиданным сортировки

CREATE TABLE TestPersons 
(
PersonID int, 
Name varchar(255), 
FirstName varchar(255), 
Address varchar(255) 
) 

insert into TestPersons(PersonID, Name, FirstName , Address) Values (1, 'name1', 'firstname1', 'adress1'); 
insert into TestPersons(PersonID, Name, FirstName , Address) Values (2, 'name2', 'firstname2', 'adress2'); 
insert into TestPersons(PersonID, Name, FirstName , Address) Values (3, 'name3', 'firstname3', 'adress3'); 
insert into TestPersons(PersonID, Name, FirstName , Address) Values (4, 'name4', 'firstname4', 'adress4'); 

Первый запрос (отлично работает):

SELECT name, firstname, personid, count(name), row_number() over (ORDER BY name, firstname) as rn 
FROM testpersons 
GROUP BY name, firstname, personid 

возвращается:

name1 firstname1 1 1 1 
name2 firstname2 2 1 2 
name3 firstname3 3 1 3 
name4 firstname4 4 1 4 

Второй запрос (неожиданный результат) :

SELECT name, firstname, personid, count(name), row_number() over (ORDER BY name desc, firstname desc) as rn 
FROM testpersons 
GROUP BY name, firstname, personid 

возвращает для всех строк NAME4 и firstname4:

name4 firstname4 4 1 1 
name4 firstname4 3 1 2 
name4 firstname4 2 1 3 
name4 firstname4 1 1 4 

Я бы ожидать, измененный порядок результата с первым запросом.

Любая идея, почему?


Выход select * from v$version выглядит следующим образом:

Oracle Database 12c Release 12.1.0.1.0 - 64bit Production 0 
PL/SQL Release 12.1.0.1.0 - Production 0 
"CORE 12.1.0.1.0 Production" 0 
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production 0 
NLSRTL Version 12.1.0.1.0 - Production 0 
+0

Мне сложно понять, как ваш второй запрос когда-либо произведет эти результаты ... Возможно, вы можете создать скрипку, демонстрирующую вашу проблему. – sgeddes

+0

Fiddle не работает для oracle somehy, вот почему я прикрепил код, все, что вам нужно, это запустить его – CloudyMarble

+0

Не уверен, что происходит с 'oracle' на скрипке, но это работает с использованием другой базы данных, которая поддерживает' window functions': http: //sqlfiddle.com/#!15/7fb5d/1 – sgeddes

ответ

0

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

Возможно, вы что-то не сказали нам? Какую версию Oracle вы используете? Как вы общаетесь с ним? Какой у вас интерфейс? Вы отправляете свои запросы напрямую или через какое-то приложение?

Что вы видите ниже, это интерфейс Oracle 11.2 XE, SQL * Plus.

SQL> CREATE TABLE TestPersons 
    2 (
    3 PersonID int, 
    4 Name varchar(255), 
    5 FirstName varchar(255), 
    6 Address varchar(255) 
    7 ); 

Table created. 

SQL> insert into TestPersons(PersonID, Name, FirstName , Address) Values (1, 'name1', 'firstname1', 'adress1'); 
1 row created. 
SQL> insert into TestPersons(PersonID, Name, FirstName , Address) Values (2, 'name2', 'firstname2', 'adress2'); 
1 row created. 
SQL> insert into TestPersons(PersonID, Name, FirstName , Address) Values (3, 'name3', 'firstname3', 'adress3'); 
1 row created. 
SQL> insert into TestPersons(PersonID, Name, FirstName , Address) Values (4, 'name4', 'firstname4', 'adress4'); 
1 row created. 

SQL> column name format a10 
SQL> column firstname format a18 

SQL> SELECT name, firstname, personid, count(name), row_number() over (ORDER BY name, firstname) as rn 
    2 FROM testpersons 
    3 GROUP BY name, firstname, personid; 

NAME  FIRSTNAME   PERSONID COUNT(NAME)   RN 
---------- ------------------ ---------- ----------- ---------- 
name1  firstname1     1   1   1 
name2  firstname2     2   1   2 
name3  firstname3     3   1   3 
name4  firstname4     4   1   4 

4 rows selected. 

SQL> SELECT name, firstname, personid, count(name), row_number() over (ORDER BY name desc, firstname desc) as rn 
    2 FROM testpersons 
    3 GROUP BY name, firstname, personid; 

NAME  FIRSTNAME   PERSONID COUNT(NAME)   RN 
---------- ------------------ ---------- ----------- ---------- 
name4  firstname4     4   1   1 
name3  firstname3     3   1   2 
name2  firstname2     2   1   3 
name1  firstname1     1   1   4 

4 rows selected. 
+0

Я использую ORA12C (Oracle Database 12c Release 12.1.0.1.0 - 64bit Production) и имел те же результаты с Frontend SQL-Developer Version 3.0.04 и verison 4 – CloudyMarble

+0

ОК, я только что протестировал Oracle 12.1 EE (Enterprise Edition) и в обоих случаях - раньше и сейчас - я использовал SQL Developer (и для того, что я написал, SQL \ * Plus). Во всех случаях я получаю то же самое, правильный результат из второго запроса. Если есть проблема, это должно быть с вашей настройкой, это не ошибка Oracle (так как одни и те же команды дают правильные результаты в моей системе). – mathguy

+0

Пробовал это с помощью SQL-Plus, производит те же неправильные результаты. мне было бы интересно узнать, есть ли у Enterprise Edition другой способ выполнения запросов. – CloudyMarble

 Смежные вопросы

  • Нет связанных вопросов^_^