Таким образом, мой синтаксис, по-видимому, правильный во всех трех случаях (PostgreSQL не зацикливается ни на чем), но результаты возвращаются в том же порядке со всеми тремя этими запросами. Даже незнакомец, когда я добавляю/удаляю DESC из любого из следующего, это тоже не влияет. Можно ли сортировать результаты на основе элементов подзапроса или нет?Подпроцессы и сортировка? (ORDER BY)
Sort by affiliation
SELECT * FROM articles_view WHERE (1=1)
AND spubid IN
(SELECT people.spubid FROM people WHERE (people.slast ilike 'doe')
GROUP BY people.spubid, people.slast, people.saffil)
AND spubid IN
(SELECT status.spubid FROM status WHERE ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) AND ((status.imonth <= 01 OR status.imonth IS NULL) AND status.iyear <= 2008) ORDER BY status.iyear, status.imonth)
Sort by last name, descending order
SELECT * FROM articles_view WHERE (1=1)
AND spubid IN
(SELECT people.spubid FROM people WHERE (people.slast ilike 'doe')
GROUP BY people.spubid, people.slast, people.saffil ORDER BY people.slast DESC)
AND spubid IN
(SELECT status.spubid FROM status WHERE ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) AND ((status.imonth <= 01 OR status.imonth IS NULL) AND status.iyear <= 2008))
Sort by year/month descending order
SELECT * FROM articles_view WHERE (1=1)
AND spubid IN
(SELECT people.spubid FROM people WHERE (people.slast ilike 'doe')
GROUP BY people.spubid, people.slast, people.saffil)
AND spubid IN
(SELECT status.spubid FROM status WHERE ((status.imonth >= 01 OR status.imonth IS NULL) AND status.iyear >= 2000) AND ((status.imonth <= 01 OR status.imonth IS NULL) AND status.iyear <= 2008) ORDER BY status.iyear, status.imonth DESC)
Я просто не уверен, почему условия ORDER BY не влияют на порядок результатов.
********* UPDATE:
То, что я в конечном итоге делает использует столбец массива, на мой взгляд (в данном случае articles_view), чтобы сделать всю сортировку. Таким образом, я делаю все в своем роде в «столбце» в основном запросе и полностью избегаю использовать JOINS. То, как определено представление, все столбцы, соответствующие данному лозунгу (первичный ключ) в таблице people/status (оба имеют 1-> много), хранятся в столбцах массива в представлении. Мой запрос с сортировкой выглядит следующим образом:
SELECT * FROM articles_view WHERE
((articles_view.skeywords_auto ilike '%ice%') OR (articles_view.skeywords_manual ilike '%ice%'))
ORDER BY (articles_view.authors[1]).slast
Причина это работает, потому что я всегда знаю, что первый элемент массива (в Postgres первого индекс 1, а не обычные 0), является основным автор (или первичный статус), который мне нужен для сортировки.
Это то, чего я боялся, я действительно хочу избежать использования соединения (продукт будет слишком большим, следовательно, вместо него будут использоваться вспомогательные запросы). –
Используя внутреннее соединение, вы получите только соответствующие результаты, а оптимизатор запросов должен определить план, который удаляет все, что не удовлетворяет предложению where до того, как будет применено соединение. –