我将尝试仅选择我正在查询的表的ID,并仍然能够指定其他列的排序。
首先,我尝试简单地执行以下操作:
那么我现在遇到的错误是“SELECT DISTINCT ON 表达式必须与初始ORDER BY表达式匹配”错。如果我不给列排序,我就不能用SELECT DISTINCT ON。
貌似这个问题唯一的解决办法是像下面这样做:
首先,我尝试简单地执行以下操作:
SELECT DISTINCT countries.id
FROM countries
...
ORDER BY province_infos.population DESC, country_infos.population ASC
那行不通,因为在使用 SELECT DISTINCT
时,ORDER BY
表达式必须出现在选择列表中,否则会返回错误。
如果我添加 province_infos.population
和 country_infos.population
,它就可以工作了,但是我会得到重复的ID,而这是不允许的。
为了解决这个问题,我尝试使用 DISTINCT ON()
:
SELECT DISTINCT ON (countries.id)
countries.id, country_infos.population, province_infos.population
FROM countries
...
ORDER BY province_infos.population DESC, country_infos.population ASC
那么我现在遇到的错误是“SELECT DISTINCT ON 表达式必须与初始ORDER BY表达式匹配”错。如果我不给列排序,我就不能用SELECT DISTINCT ON。
貌似这个问题唯一的解决办法是像下面这样做:
SELECT DISTINCT ON (countries.id)
countries.id
FROM countries
...
ORDER BY countries.id DESC, province_infos.population DESC, country_infos.population ASC
很遗憾,我无法这样做,因为我不能按ID排序,因为它会影响其他排序结果。而且似乎唯一的不按ID排序的方法是从选择中删除DISTINCT
,但那样我就会得到重复的结果。
有人知道我如何解决这个问题吗?
编辑:
我省略的...
应该不相关,但如果您想看到:
JOIN country_infos ON country_infos.country_refer = countries.id
JOIN languages ON languages.country_refer = countries.id
JOIN provinces ON provinces.country_refer = countries.id
JOIN province_infos ON province_infos.province_refer = provinces.id
WHERE country_infos.population > 10.3
AND languages.alphabet = 'Latin'
我不仅仅是试图让这个特定的查询工作。这只是我用来解释困境的一个例子。我正在根据任意数据结构自动生成这些类型的查询。