作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想编写一个使用 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
不再可用。
我如何对最终查询进行排序,以便 people
View 的原始序列遵循最终查询?
这里的简单解决方案是只在 View 中包含 p.last_name。我不想那样做 - 我的真实世界示例(复杂得多)使这成为一个问题。
我过去对临时表做过类似的事情。例如,我使用 CREATE TEMP TABLE testing WITH OIDS
创建表,然后执行 ORDER BY testing.oid
以传递原始序列。
是否可以对 View 执行相同的操作?
最佳答案
如果您使用 row_number() over()
,这是可能的。
这是一个例子:
SELECT
p.*
,h.address
,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.*
,h.address
,h.appraisal
FROM (SELECT *, 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(),可以轻松搜索其他字段。
祝你好运。
关于sql - 带有 View 的 PostgreSQL ORDER BY,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14636901/
我是一名优秀的程序员,十分优秀!