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

关系除法

适用于 ✅ 开源版   ✅ 专业版   ✅ 企业版

关系代数中有一个操作没有受到太多关注,因为它在实际应用中很少使用。 它是关系除法,是笛卡尔积(或关系乘法)的相反运算。 以下是关系除法的近似定义

Assume the following cross join / cartesian product
C = A × B

Then it can be said that
A = C ÷ B
B = C ÷ A

使用 jOOQ,您可以使用以下语法简化关系除法

C.divideBy(B).on(C.ID.eq(B.C_ID)).returning(C.TEXT)

以上大致翻译为

SELECT DISTINCT C.TEXT FROM C "c1"
WHERE NOT EXISTS (
  SELECT 1 FROM B
  WHERE NOT EXISTS (
    SELECT 1 FROM C "c2"
    WHERE "c2".TEXT = "c1".TEXT
    AND "c2".ID = B.C_ID
  )
)

或者用纯文本表示:在 C 中查找那些 ID 对应于 B 中所有 ID 的 TEXT 值。请注意,从上面的 SQL 语句中,可以立即清楚地看出正确的索引编制至关重要。 请务必在从 on(...) 和 returning(...) 子句引用的所有列上建立索引。

有关关系除法的更多信息和一些很好的实际示例,请参见

引用此页

反馈

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

The jOOQ Logo