UNIQUE谓词
适用于 ✅ 开源版 ✅ 专业版 ✅ 企业版
UNIQUE
谓词由 SQL 标准定义,但几乎没有数据库实现此功能。它是一个独立的谓词(很像 EXISTS 谓词),用于检查给定子查询返回的行的唯一性。可以在这里看到 UNIQUE
谓词的示例
UNIQUE (SELECT PUBLISHED_IN FROM BOOK WHERE AUTHOR_ID = 3) NOT UNIQUE (SELECT PUBLISHED_IN FROM BOOK WHERE AUTHOR_ID = 3)
unique(create.select(BOOK.PUBLISHED_IN).from(BOOK) .where(BOOK.AUTHOR_ID.eq(3))); notUnique(create.select(BOOK.PUBLISHED_IN).from(BOOK) .where(BOOK.AUTHOR_ID.eq(3)));
只有当给定作者撰写的所有书籍都发表于不同的年份时,上面的第一个示例的计算结果才为 TRUE
,而如果作者在同一年发表了至少两本书,则第二个示例的计算结果将为 TRUE
。
目前,jOOQ 使用带有 GROUP BY
子查询包装原始子查询的 EXISTS
谓词来模拟所有数据库的 UNIQUE
谓词
NOT EXISTS ( SELECT 1 FROM ( SELECT PUBLISHED_IN FROM BOOK WHERE AUTHOR_ID = 3 ) T WHERE (T.PUBLISHED_IN) IS NOT NULL GROUP BY T.PUBLISHED_IN HAVING COUNT(*) > 1 )
NULL 值
请注意(按照 SQL 标准的要求),子查询返回的任何行,如果任何投影列具有 NULL
值,则 UNIQUE
谓词将忽略这些行。此外,对于不返回任何行(或所有行都至少有一个 NULL
值)的子查询,UNIQUE
谓词的计算结果为 TRUE
。
方言支持
此示例使用 jOOQ
unique(select(BOOK.PUBLISHED_IN).from(BOOK))
翻译成以下特定方言的表达式
ASE, Access, Aurora MySQL, BigQuery, ClickHouse, CockroachDB, DB2, Databricks, Derby, DuckDB, Exasol, Firebird, HSQLDB, Hana, Informix, MariaDB, MemSQL, MySQL, Oracle, SQLDataWarehouse, SQLServer, SQLite, Snowflake, Sybase, Teradata, Trino, Vertica
NOT EXISTS ( SELECT 1 FROM ( SELECT BOOK.PUBLISHED_IN FROM BOOK ) t WHERE t.PUBLISHED_IN IS NOT NULL GROUP BY t.PUBLISHED_IN HAVING count(*) > 1 )
Aurora Postgres, Postgres, Redshift, YugabyteDB
NOT EXISTS ( SELECT 1 FROM ( SELECT BOOK.PUBLISHED_IN FROM BOOK ) t WHERE (t.PUBLISHED_IN) IS NOT NULL GROUP BY t.PUBLISHED_IN HAVING count(*) > 1 )
H2
UNIQUE ( SELECT BOOK.PUBLISHED_IN FROM BOOK )
使用 jOOQ 3.21 生成。早期 jOOQ 版本的支持可能有所不同。 在我们的网站上翻译您自己的 SQL
反馈
您对此页面有任何反馈吗? 我们很乐意听取您的意见!