【问题标题】:How to model or query for something that does not exist in relational algebra [closed]关系代数中的空值
【发布时间】:2019-09-03 22:33:53
【问题描述】:

我要查询所有从未出租过的公寓的id

我试过这样的:

(π a_id
(apartments))
-
(π a_id
σ from_date Exists ∧ end_date Exists 
(rental) ⨝ rental.a_id on apartment.a_id (apartment))

但我认为我不能在关系代数中使用 Exist 或 null 或任何东西。

我该怎么做?

谢谢

我附上架构here

【问题讨论】:

  • 有很多 RA(关系代数)。它们在运算符甚至关系是什么方面都不同。给你的参考和/或定义。例如教科书名称、版本和页码。请use text, not images/links, for text--including tables & ERDs. 仅将图像用于无法表达为文本或增强文本的内容。无法搜索或剪切和粘贴图像。在图像中包含图例/键和说明。让您的帖子自成一体。
  • 请参阅How to Ask,点击谷歌搜索“stackexchange 作业”和投票箭头鼠标悬停文本。你能做哪些部分?你被困在哪里了?您的教科书或文档对任何相关内容有什么看法? PS RA 是一种编程语言——即使您是手工工作。请在代码问题中给出minimal reproducible example--cut & paste & runnable code 加上所需的输出加上清晰的规范和解释。这包括您可以提供的最少代码,即您显示的代码可以通过您显示的代码扩展为不可以。 (调试基础。)PS Google“在线执行关系代数”。
  • 您可以做哪些您认为正确的相关查询?他们返回什么行?为什么?然后,我们可以帮助您解决问题。显示无效代码对您没有帮助,因为它没有任何意义。您需要使用语言来解释您正在尝试做的事情——您希望拥有哪些部分以及您希望如何使用它们。 PS 当给出表格时,准确地说出一行在表格中时根据其列值对业务情况的描述。在描述查询结果时也是如此。 PSRe relational algebra querying..
  • 当你提到null&exists的时候,是不是因为你想到了SQLleft join on where is not null&where not exists?你知道 SQL except 和 Oracle minus 是什么吗? PS看我的回答。

标签: database null exists relational-algebra


【解决方案1】:

我们如何根据表中行的含义进行查询和推理

对于最直接的关系代数,其中关系的属性设置为标题,元组设置为主体:

每个查询表达式都有一个关联的(特征)谓词--fill-in-the-(named)-blanks 语句模板,由属性参数化。使谓词成为真正的命题——陈述——的元组在关系中。如果不告知每个基本关系的谓词,我们就无法更新或查询业务情况。

我们得到了关系(值或变量)名称的表达式的谓词。

让查询表达式 E 有谓词 e。那么:

  • R ⨝ S 有谓词 r and s
  • R ∪ S 有谓词 r or s
  • R - S 有谓词 r and not s
  • σ p (R) 有谓词 r and p
  • π A (R) 有谓词 exists non-A attributes of R [r]

给定一个关系代数查询,我们可以从叶子开始应用上述事实来获得其谓词的表达式。给定一个谓词表达式,我们可以类似地将上述事实应用到另一个方面;如有必要,我们首先重新排列为一个等效表达式,其中每个 - 都有 2 个具有相同属性的参数。 (它总是可以将每个 Codd 的归约算法 重新排列为某个 prenex 范式。)

Re relational algebra querying.

将其应用于您的查询

大概 Apartment 中的公寓 ID 用于公寓,而 Rental 中的公寓 ID 用于出租公寓。那么未出租的公寓是公寓中的公寓,而不是出租公寓。它们的 id 是那些基本关系的投影之间的关系差异中的那些。

猜测您的 ERD 的图例/键,Rental 引用公寓中有一个 FK(外键)。这证实了 Rental 中的公寓也在 Apartment 中。所以Apartment ⨝ RentalRental 拥有相同的公寓。这确认您不需要加入;您可以将 Rental 用于出租公寓。

你提到了 NULL & EXISTS。也许您正在谈论 SQL NULL & EXISTS 和/或您正在尝试查找 SQL 查询的关系代数版本和/或您正在使用 SQL 进行推理。和/或您可能正在谈论逻辑 EXISTS 以及值是否存在于列或元组中。

根据关于租房的常识以及从您不说其他情况来看,Rental 可能是occupant O rented apartment A from date F to date T 所在的行。但是你提到了NULL。从常识和猜测 T 可以为 NULL,Rental 似乎是 occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null 所在的行。

NULL 是一个由 SQL 运算符和语法特殊处理的值。我们不知道您的代数和语言如何处理 NULL。在数学EXISTS X [p]FOR SOME X [p] 中说存在一个值,我们可以将其命名为满足条件 p 的 X。 SQLEXISTS (R)表示表R中是否存在行。即EXISTS t [t IN R]是否存在。当 R 为 (X,...) rows where r 时,即是否为EXISTS X,... [r]

当 R 是 r 所在的行时,π x (R) 定义为 EXISTS 所在的行 non-x attributes of R [r]。所以π A (Rental)EXISTS O,F,T [occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null] 所在的行。

当 R 是 r 所在的行时,σ p (R) 定义为 r & p 所在的行。 occupant O rented apartment A from date F ongoing & T is null 所在的行是 (occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null) & T is null 所在的行。那是σ T is null (Rental)

当 R 是行,其中 r 和 S 是行,其中 s,R - S 定义为行,其中r & NOT s。假设Apartmentapartment A has S square feet ... 所在的行。你想要EXISTS S,... [apartment A has S square feet ...] & NOT EXISTS O,F,T [occupant O rented apartment A from date F to date T OR occupant O rented apartment A from date F ongoing & T is null] 的行。那是π A (Apartment) - π A (Rental)。这就是本节开头的关系差异。

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多