Sql 为什么分区需要嵌套选择?

Sql 为什么分区需要嵌套选择?,sql,postgresql,Sql,Postgresql,我有一个页面可以显示每个用户发送的10条消息。不要问我为什么 我有以下代码: 选择*,按用户id多分配的行数作为行数 发帖 其中row_num似乎与任何查询的规则相同,WHERE子句看不到列别名 这也将失败 SELECT id AS newid FROM test WHERE newid=1; -- must use "id" in WHERE clause SQL查询,如: SELECT * FROM table WHERE <condition> 将按下一顺序执行:

我有一个页面可以显示每个用户发送的10条消息。不要问我为什么 我有以下代码:

选择*,按用户id多分配的行数作为行数 发帖
其中row_num似乎与任何查询的规则相同,WHERE子句看不到列别名

这也将失败

SELECT id AS newid
FROM test
WHERE newid=1;     -- must use "id" in WHERE clause
SQL查询,如:

SELECT *
FROM table
WHERE <condition>
将按下一顺序执行:

3.SELECT *
1.FROM table
2.WHERE <condition>
所以,正如JoachimIsaksson所说,SELECt子句中的列在WHERE子句中是不可见的,因为处理顺序不同

在第二个查询中,列row_num是从第一个子句中获取的,所以它将在WHERE子句中可见


是步骤执行顺序的简单列表。

您可以在dba.stockexchange.com上查看和了解SQL执行SELECT子句的顺序。我认为它不仅适用于PostgreSQL,而且适用于所有RDBMS。

在标准SQL中有一个很好的理由支持这一规则

考虑以下陈述:

SELECT *, row_number() over (partition by user_id) as row_num
FROM "posts"
WHERE row_num <= 10 and p.type = 'xxx';
p.type='xxx'何时相对于行号进行计算?换句话说,这会返回xxx的前十行吗?还是返回前十行的XXX


SQL语言的设计者认识到这是一个很难解决的问题。只有在select子句中允许它们才能解决问题。

Clearify不起作用。有错误信息吗?可能是因为您不能在where子句中使用列别名?不确定Postgresql是否允许这样做?似乎Postgres在这方面与Oracle类似:您不能通过别名引用列,只能通过表达式本身。。。只是猜测一下,因为我没有PG经验,但我会尝试这样做:从帖子中选择*,row_number overpartition by user_id作为row_num,其中row_number overpartition by user_id row_num不是帖子中的一列,而是子查询t中的一列。