AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-27070

Raymond Nijland's questions

Martin Hope
Raymond Nijland
Asked: 2019-03-10 10:52:57 +0800 CST

子查询(派生表)中的 ORDER BY 用法 SQL 标准是否允许

  • 1

MariaDB 文档提到ORDER BYSQL 标准从不允许子查询(派生表)中的子句。

含义 SQL 查询

SELECT
   field1
 , field2
FROM (
  SELECT
       field1
     , field2
  FROM
   table1
  ORDER BY field2
) alias

SQL 标准从不允许

根据 SQL 标准,“表”(以及 FROM 子句中的子查询)是一组无序的行。表中的行(或 FROM 子句中的子查询)没有任何特定的顺序。这就是优化器可以忽略您指定的 ORDER BY 子句的原因。事实上,SQL 标准甚至不允许 ORDER BY 子句出现在这个子查询中

见源

但是当我查看 SQL 92 标准时。(我知道它很旧)

4.9 表格

...
...
表可以是基表、查看表或派生表。 基表可以是持久基表、全局临时表、已创建的本地临时表或已声明的本地临时表。
...
...
派生表是通过评估 a 直接或间接从一个或多个其他表派生的表<query expression>。派生表的值派生自评估时基础表的<query expression>值。
……
_

派生表和游标的简单基础表在子条款 7.9、"<query specification>"……、子条款 7.10、…… "<query expression>"和子条款 13.1 ……中定义"<declare cursor>"。查看的表没有简单的基础表。

他们提到游标,让我们看看他们对游标的看法以及它们是什么。

4.21 光标

……
_

处于打开状态的游标标识一个表、该表的行的顺序以及相对于该顺序的位置。如果<declare cursor>不包含<order by clause>,或包含<order by clause>不完全指定行顺序的 ,则表的行具有仅在<order by clause>指定顺序的范围内定义的顺序,否则依赖于实现。

所以他们在这里提到处于打开状态的游标可以是表,可以是基表、查看表或派生表。如果您在第 4.9 节表中查看他们如何定义表是什么

如果我读到这篇文章,我可能会将其解释为ORDER BY在派生表中使用(如上面的 SQL 查询)对于 SQL 标准是完全有效的,这取决于供应商是否允许将ORDER BY其作为选项。
但我会解释错英语不是我的母亲 laungauge,所以问题是我解释正确吗?

sql-standard
  • 1 个回答
  • 1919 Views
Martin Hope
Raymond Nijland
Asked: 2017-10-08 07:46:07 +0800 CST

在 MySQL 中模拟有效的 LEAD(1) 或 LEAD(2)

  • 4

假设我有一张带有荷兰语或英语字母表的桌子。

阿尔法贝特

digit   
--------
a       
b       
c       
d       
e       
f       
g       
h       
i       
j       
k       
l       
m       
n       
o       
p       
q       
r       
s       
t       
x       
y       
z       

现在我想显示这样的列表。

digit   next_digit  next_two_digit  
------  ----------  ----------------
a       b           c               
b       c           d               
c       d           e               
d       e           f               
e       f           g               
f       g           h               
g       h           i               
h       i           j               
i       j           k               
j       k           l               
k       l           m               
l       m           n               
m       n           o               
n       o           p               
o       p           q               
p       q           r               
q       r           s               
r       s           t               
s       t           x               
t       x           y               
x       y           z               
y       z           (NULL)          
z       (NULL)      (NULL)    

在 Oracle(以及更多支持窗口函数的数据库)中,您可以使用以下命令获取此列表

SELECT 
   "digit"
 , LEAD("digit", 1) OVER (ORDER BY "digit" ASC) as next_digit   
 , LEAD("digit", 2) OVER (ORDER BY "digit" ASC) as next_two_digits
FROM 
 alfabet
ORDER BY 
 "digit" asc

演示http://www.sqlfiddle.com/#!4/a11f1/4

现在我想在MySQL中模拟窗口函数lead(1)和lead(2)。

现在在 MySQL 中,我知道我可以通过像这样的相关子查询得到相同的结果。

SELECT 
 *
 , (SELECT 
     *
    FROM 
     alfabet alfabetInner 
    WHERE
      alfabetInner.digit > alfabet.digit     
    ORDER BY 
      digit ASC
    LIMIT 0, 1      
   ) AS next_digit

 , (SELECT 
     *
    FROM 
     alfabet alfabetInner 
    WHERE
      alfabetInner.digit > alfabet.digit     
    ORDER BY 
      digit ASC
    LIMIT 1, 1      
   ) AS next_two_digit   
FROM 
 alfabet  
ORDER BY
 alfabet.digit ASC 

编辑因为来自埃文卡罗尔的评论

为什么表 Alfabet 不只存储 id/行号?

因为我想模拟一个纯 LEAD(1) 或 LEAD(2) 解决方案,而不必需要一个没有间隙的自动递增序列作为 PRIMARY ID...Oracle 关闭的窗口函数也不会使用自动递增 PRIMARY 键做任何事情。

演示http://www.sqlfiddle.com/#!9/6a8701/2

现在的问题。你知道更多(有效的)LEAD 模拟方法吗?

mysql
  • 1 个回答
  • 8083 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve