带有VIEW的PostgreSQL ORDER BY
发布时间:2020-12-13 16:02:15 所属栏目:百科 来源:网络整理
导读:假设我想编写一个使用VIEW的简单SELECT查询: CREATE TEMP VIEW people ASSELECT p.person_id,p.full_name,p.phoneFROM person pORDER BY p.last_name;SELECT p.*,h.address,h.appraisalFROM people pLEFT JOIN homes h ON h.person_id = p.person_idORDER B
假设我想编写一个使用VIEW的简单SELECT查询:
CREATE TEMP VIEW people AS SELECT p.person_id,p.full_name,p.phone FROM person p ORDER BY p.last_name; SELECT p.*,h.address,h.appraisal FROM people p LEFT JOIN homes h ON h.person_id = p.person_id ORDER BY p.last_name,h.appraisal; 这里显而易见的问题是,当我去执行最终的ORDER BY时,p.last_name不再可用. 如何对最终查询进行排序,以便人员视图的原始序列跟进到最终查询? 这里的简单解决方案是将p.last_name包含在视图中.我不想这样做 – 我的真实世界的例子(更复杂)使这成为一个问题. 我过去和临时表做过类似的事情.例如,我使用CREATE TEMP TABLE测试WITH OIDS创建表,然后执行ORDER BY testing.oid以传递原始序列. 是否有可能对视图做同样的事情? 解决方法
如果你使用row_number()over(),这是可能的.
这是一个例子: SELECT p.*,h.appraisal FROM (SELECT *,row_number() over() rn FROM people) p LEFT JOIN homes h ON h.person_id = p.person_id ORDER BY p.rn,h.appraisal; 这是您可以测试的SQL Fiddle. 正如@Erwin Brandstetter正确指出的那样,使用rank()将产生正确的结果并允许对其他字段进行排序(在这种情况下,评估). SELECT p.*,rank() over() rn FROM people) p LEFT JOIN homes h ON h.person_id = p.person_id ORDER BY p.rn,h.appraisal; 用这种方式考虑一下,使用row_number(),它总是只按该字段排序,而不管其他任何排序参数.通过使用rank(),其中tie是相同的,可以很容易地搜索其他字段. 祝好运. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |