2015-07-29 10 views
0

Я использую Postgresql 9,2 и имеет простые студент таблицы следоватьPostgresql внутренний выберите с отчетливым

id | proj_id | mark | name | test_date 

У меня есть 2 запросов, которые описаны ниже

select * from (select distinct on (proj_id) proj_id , mark, name, 
test_date from students) 
t 
where t.mark <= 1000 

VS

select distinct on (proj_id) proj_id , mark, name, test_date from 
students where mark <= 1000 

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

это ошибка postgresql 9.2 или мне что-то не хватает?

+1

'отличный on' без' заказ by' не имеет смысла. Строки в реляционной базе данных не имеют подразумеваемого порядка. Без 'order by' база данных может возвращать их в любом порядке, который, по его мнению, наиболее эффективен –

+0

проблема не в порядке, в результате какой-то результат потеряет первый запрос, вернет меньше строк, чем последний. –

ответ

1

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

  • Первый запрос получает отличный набор результатов, а затем применяет фильтр «метки».
  • Второй запрос применяется к фильтру 'mark', а затем получает отличный набор результатов.

Как вы не имеете любой порядок применяется первый запрос может потенциальный доход разное количество строк каждый раз, когда он запускается - как mark поле может содержать любое из значений, которые относятся к proj_id.

+0

Вы имеете в виду, если я буду применять порядок по результату, будет то же самое? Мне нужно получить тот же результат –

+0

Да - если вы применили «ORDER BY mark DESC» к второму запросу в первом запросе, он должен получить те же результаты. –

+0

У меня есть 15000 записей в таблице учеников и запрос 'select * from (select distinct on (proj_id) proj_id, mark, name, test_date от студентов ORDER BY proj_id, отметка DESC) t где t.mark <= 1000' ничего не возвращает –