我想合并两个实际上处于分层星座中的表。
我将如何用关系代数来写它?假设表 A 是 1:n 关系中 B 的父表。
首先,我在 A 上进行选择,然后我只想与 B 中的这些条目建立联合,这些条目将与 A 上的选择连接。
我想以数据库评估它的方式编写它。
有条件结合这样的东西吗?
我想合并两个实际上处于分层星座中的表。
我将如何用关系代数来写它?假设表 A 是 1:n 关系中 B 的父表。
首先,我在 A 上进行选择,然后我只想与 B 中的这些条目建立联合,这些条目将与 A 上的选择连接。
我想以数据库评估它的方式编写它。
有条件结合这样的东西吗?
如果我很好地理解了这个问题,那么您的任务可以通过使用递归查询来解决。Oracle(请参阅和 SQLServer(2005 及更高版本)都支持它。当然,不同的 RDMS 供应商使用略有不同的语法。
你是说相交吗?考虑 relvars
Customers
和Orders
一个客户有零个、一个或多个订单的对应关系(不过我不会将其称为层次结构)。要查找有订单的客户:我宁愿怀疑这不是你的意思,请修改你的问题以添加示例数据和预期结果。
我不确定你所说的 UNION 是什么意思。请解释!
如果您指的是“垂直”组合行集的 UNION 运算符,那么这可能会为您解决问题:
这将对两个表执行一次扫描操作,而不是针对以下查询对表 A 执行至少两次扫描:
现在,当您说 UNION 时,您可能只是指数学交集,在这种情况下,上面的最后一个 SELECT 将是您所需要的——一个简单的 JOIN 操作:
更新
显然,某些数据库引擎具有不同的功能。例如,我下面的示例脚本中的最后两个查询(据报道)在 MySQL 中具有非常不同的执行计划,但它们在 SQL Server 中是相同的,SQL Server 通过更改连接顺序、左/右输入位置和移动来选择最佳访问路径根据需要周围的条件。它不会卡住先做 JOIN,然后再做 WHERE。
为了支持我关于 SQL Server 的声明,我编写了一些测试脚本。这会加载一个包含 100 万行的父表和一个包含大约 250 万行的子表。我们正在寻找的各个行都很好地放入堆栈中(完全没有必要,我知道,但是嘿,这很有趣)。
这两个执行计划是相同的。我抑制了并行性,因为它只是不需要的噪音(计划仍然相同)。这是删除查询后的 SHOWPLAN 结果(唯一不同的部分)。