可用版本:Dev (3.21) | 最新 (3.20) | 3.19 | 3.18 | 3.17 | 3.16 | 3.15 | 3.14 | 3.13 | 3.12

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

反馈

您对此页面有任何反馈吗? 我们很乐意听取您的意见!

The jOOQ Logo