WITH TIES子句
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
前一章讨论了LIMIT 子句,它将结果集限制为一定数量的行。 SQL 标准指定了以下语法
OFFSET m { ROW | ROWS } FETCH { FIRST | NEXT } n { ROW | ROWS } { ONLY | WITH TIES }
默认情况下,大多数用户将使用 ONLY
关键字的语义,这意味着 LIMIT 5
表达式(或 FETCH NEXT 5 ROWS ONLY
表达式)最多会产生 5 行。 替代子句 WITH TIES
最多返回 5 行,除非第 5 行和第 6 行(等等)根据 ORDER BY
子句“绑定”,这意味着 ORDER BY
子句不能确定性地产生第 5 行或第 6 行。 例如,让我们看看我们的 book 表
SELECT * FROM book ORDER BY author_id FETCH NEXT 1 ROWS WITH TIES
DSL.using(configuration) .selectFrom(BOOK) .orderBy(BOOK.AUTHOR_ID) .limit(1).withTies() .fetch();
结果是
+----+----------+-------------+ | id | actor_id | title | +----+----------+-------------+ | 1 | 1 | 1984 | | 2 | 1 | Animal Farm | +----+----------+-------------+
我们现在得到了两行,因为当按 ACTOR_ID
排序时,两行都“绑定”了。 数据库无法真正选择下一行,因此它们都被返回。 如果我们省略 WITH TIES
子句,则只会返回随机一行。
方言支持
此示例使用 jOOQ
select(BOOK.ID).from(BOOK).orderBy(BOOK.AUTHOR_ID).limit(1).withTies()
翻译成以下特定方言的表达式
Aurora Postgres, CockroachDB, DB2, Firebird, Hana, MySQL, Sybase, Vertica, YugabyteDB
SELECT v0 ID FROM ( SELECT BOOK.ID v0, rank() OVER (ORDER BY BOOK.AUTHOR_ID) rn FROM BOOK ) x WHERE rn <= (0 + 1) ORDER BY rn
BigQuery, Databricks, DuckDB, Exasol, Snowflake
SELECT BOOK.ID FROM BOOK QUALIFY rank() OVER (ORDER BY BOOK.AUTHOR_ID) <= (0 + 1)
ClickHouse, H2, MariaDB, Oracle, Postgres, Trino
SELECT BOOK.ID FROM BOOK ORDER BY BOOK.AUTHOR_ID FETCH NEXT 1 ROWS WITH TIES
Informix
SELECT v0 ID FROM ( SELECT * FROM ( SELECT BOOK.ID v0, rank() OVER (ORDER BY BOOK.AUTHOR_ID) rn FROM BOOK ) x ) x WHERE rn <= (0 + 1) ORDER BY rn
Redshift
SELECT BOOK.ID FROM BOOK WHERE 1 = 1 QUALIFY rank() OVER (ORDER BY BOOK.AUTHOR_ID) <= (0 + 1)
SQLDataWarehouse, SQLServer, Teradata
SELECT TOP 1 WITH TIES BOOK.ID FROM BOOK ORDER BY BOOK.AUTHOR_ID
ASE, Access, Aurora MySQL, Derby, HSQLDB, MemSQL, SQLite
/* UNSUPPORTED */
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!