因此,我的语法在所有三种情况下显然都是正确的(PostgreSQL并没有引起任何关注)但结果会以相同的顺序返回所有这三个查询。当我从以下任何一个添加/删除DESC时,它甚至更加陌生,它也没有任何影响。是否可以根据子查询的元素对结果进行排序?
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条件对结果的顺序没有影响。
*********更新:
我最终做的是在我的视图中使用数组列(在本例中为articles_view)来完成我的所有排序。这样我就可以在主查询中的“列”上完成所有这些操作,完全避免使用JOINS。定义视图的方式,与人员/状态表中的给定pubid(主键)匹配的所有列(都具有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),是主要作者(或主要状态),这是我需要的排序
答案 0 :(得分:3)
所有子查询都在为条件提供一组结果来检查spubid是否存在。您需要实际连接到状态表,然后在外部查询的order by子句中使用列。
类似的东西:
SELECT *
FROM articles_view
INNER JOIN status ON articles_view.spubid = status.spubid
INNER JOIN people ON articles_view.spubid = people.spubid
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 AND people.slast ilike 'doe')
ORDER BY status.iyear, status.imonth
答案 1 :(得分:2)
您没有订购外部查询;您只需订购内部查询。这是完全合法的,但你对这些内在结果所做的只是将spubid
与它们进行比较,并且你做的顺序并不重要。
您要找的是JOIN
。
SELECT *
FROM articles_view
INNER JOIN status ON (status.spubid = articles_view.spubid AND ((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))
WHERE spubid IN
(SELECT people.spubid FROM people WHERE (people.slast ilike 'doe')
GROUP BY people.spubid, people.slast, people.saffil )
ORDER BY status.iyear, status.imonth DESC
(您可以将其他查找重写为连接,但为了简单起见,我只留下了一个。)
答案 2 :(得分:1)
您只是对IN语句使用的数据进行排序。您需要对顶级Select语句进行排序。
编辑:
由于IN子句中的Select语句不会对结果的整体排序做出贡献,因此应该通过子句删除顺序,从而防止服务器不必进行不必要的处理。
答案 3 :(得分:0)
我最终做的是在我的视图中使用数组列(在本例中为articles_view)来完成我的所有排序。这样我就可以在主查询中的“列”上完成所有这些操作,完全避免使用JOINS。定义视图的方式,与人员/状态表中的给定pubid(主键)匹配的所有列(都具有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),是主要作者(或主要状态),这是我需要的排序