【发布时间】:2013-01-16 05:03:23
【问题描述】:
假设我想编写一个使用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 视图的原始序列跟随最终查询?
这里的简单解决方案是在视图中包含 p.last_name。我不想那样做——我在现实世界中的例子(要复杂得多)让这成为一个问题。
过去我对临时表做过类似的事情。例如,我使用CREATE TEMP TABLE testing WITH OIDS 创建表,然后执行ORDER BY testing.oid 以通过原始序列。
是否可以对视图做同样的事情?
【问题讨论】:
-
last_name在people视图中有什么问题? -
我的实际视图和查询比我上面给出的简化粒度示例要复杂得多。解释为什么我想避免通过额外的列是不必要的复杂。要回答这个问题,您必须在不了解原因的情况下接受该要求。
-
我总是对 Postgres 允许在视图中使用
order by感到惊讶。这根本没有意义。 -
哈哈。可能有点草率或只是养眼。就关系而言,无论如何它都没有意义:结果集是无序的,因此可以忽略任何排序。它不会造成伤害(就像
exists(...)相关子查询中的LIMIT 1...)顺便说一句:在这种情况下,它确实有意义:在外部查询中使用 VIEW 或在子查询中。子查询可能会忽略;外部查询可能不会。 -
我冒昧地修复了问题中视图创建的非法语法,因为它不会干扰问题。
标签: sql postgresql sql-order-by sql-view postgresql-9.2