作为一个新手到PostgreSQL(我动过,因为我感动我的网站的Heroku谁只支持它,我有重构我的一些疑问和代码。下面是我不能完全理解的问题的问题有:
PGError: ERROR: column "l_user_id" does not exist
LINE 1: ...t_id where l.user_id = 8 order by l2.geopoint_id, l_user_id ...
^
...查询:
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l_user_id = l2.user_id desc
加入条款“l.user_id为l_user_id,l.geopoint_id为l_geopoint_id”因为很明显Postgres的确不喜欢与不选择的字段顺序条款。 但错误我现在得到使它看起来像我还没有得到混淆。 任何人只要有Postgres的经验看这个问题?
我可能有一帮这样的问题 - 查询在MySQL工作得很好...
在PostgreSQL你不能为了使用表达的别名。 只有平原的别名在那里工作。 您的查询应该是这样的:
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l.user_id = l2.user_id desc;
我假设你的意思是l2.user_id=l.user_id
应该先走。
这是相关信息的PostgreSQL-general邮件列表上。 以下是在的文档ORDER BY
子句 :
每个表达式可以是名称或输出列的序数 (选择列表项),或者它可以是从输入列值构成的任意表达式 。
当使用表达式因此,没有别名。
你有:
order by l2.geopoint_id, l_user_id = l2.user_id desc
在您的查询。 这是非法的语法。 删除= l2.user_id
部分(将其移动到where
,如果这是的加盟条件之一者),它应该工作。
更新下选择(与= l2.user_id
删除)应该工作得很好。 我上的Postgres 8.3进行了测试(使用不同的表/列名,很明显)
select distinct
l2.*,
l.user_id as l_user_id,
l.geopoint_id as l_geopoint_id
from locations l
left join locations l2 on l.geopoint_id = l2.geopoint_id
where l.user_id = 8
order by l2.geopoint_id, l_user_id desc
我跑进使用功能从fuzzystrmatch同样的问题 - 尤其是莱文斯坦功能。 我需要筛选结果既排序字符串距离,经串并距离。 我本来想:
SELECT thing.*,
levenshtein(thing.name, '%s') AS dist
FROM thing
WHERE dist < character_length(thing.name)/2
ORDER BY dist
但是,当然,我得到了错误“列” DIST“不存在”,从WHERE子句。 我想这和它的工作:
SELECT thing.*,
(levenshtein(thing.name, '%s')) AS dist
FROM thing
ORDER BY dist
但是我需要有在WHERE子句中那个资格。 有人在这个问题别人说,以前ORDER BY,因此列是不存在的,当它评估的WHERE子句WHERE子句进行评估。 通过咨询去,我想通了,一个嵌套的SELECT语句的伎俩:
SELECT * FROM
(SELECT thing.*,
(levenshtein(thing.name, '%s')) AS dist
FROM thing
ORDER BY dist
) items
WHERE dist < (character_length(items.name)/2)
请注意,“项目”表的别名是必需的,DIST列别名是在外部选择,因为它在声明中独特的访问。 这是一个有点古怪,我很惊讶,它必须是这样的PG - 但它似乎并没有采取打让我很满意的表演。
“加入,因为显然Postgres的确不喜欢与不选择的字段顺序条款”
“至于为了通过老话 - 是的,PostgreSQL的(和许多其他数据库)不允许排序由未在SELECT子句中列出的列”
只是普通的不真实。
=> SELECT ID FROM T1 ORDER BY所有者LIMIT 5;
ID
30 10 20 50 40(5行)