加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

带有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是相同的,可以很容易地搜索其他字段.

祝好运.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读