theta join和内部联接看起来与我完全相同:它们是笛卡尔积,然后是任意选择。还是我错过了他们的分歧?感谢。
上面的维基百科链接表示theta-join需要进行比较&两个属性。但这不正确。相反,theta-join可以采取任何选择条件。
来自数据库系统概念,它应该遵循SQL标准,比维基百科更连贯可靠:
theta join操作是自然连接操作的变体 这使我们能够将选择和笛卡尔积相结合 单一操作。考虑关系r(R)和s(S),并且将θ设为a 模式中的属性谓词R∪S. theta连接操作 r join_theta s的定义如下:
r join_theta s = sigma_theta(r×s)
...
我们之前研究过的不保留不匹配的联接操作 元组称为内部联接操作,以区别于它们 外连接操作。
我仍然认为他们是同一个概念。
Difference between a theta join, equijoin and natural join没有解释theta连接和内连接之间的区别。
答案 0 :(得分:4)
没有单一的“关系代数”。它们甚至在关系中也有所不同。 Codd最初将theta join定义为采用二元运算符(theta)&两个属性。这就是人们通常所说的术语。来自Codd 1992年出版的“数据库管理关系模型第2版”一书:
RB-14-RB-23 Theta-Join运算符
theta-join运算符使用两个R表作为其操作数。它 生成一个包含一个操作数行的R表 (比方说S)与第二个操作数(比如T)的行连接,但是 仅在发现指定条件成立的情况下。为简洁起见, 此运算符通常称为 join 。
join 运算符中表示的条件涉及比较每个条件 来自S列的值,其中每个值来自T列。列 要比较的内容在 join 命令中明确指出;这些专栏 被称为比较列。这种情况可能涉及10个中的任何一个 列表中引用的比较器[...]
(通常这个术语用于像这样的运算符,但值可以取代属性。)
但是,Codd在那里与自己相矛盾,因为有“两个操作数”,但也有“特定条件”。后来他再次自相矛盾,说有一大堆联合称为theta-joins,equi-join就是其中之一:RB-25自然加入运算符
如上一节所述, equi-join 会生成结果 其中两列的值相同,但不同 在列名称中。这两列来自比较 操作数的列;当然,列可能是 简单或复合。在 theta-join , equi-join 的10种类型中 是唯一一个产生比较列的结果的人 是完全多余的,一个与另一个。 自然加入 表现就像 equi-join ,除了其中一个冗余 结果中省略了简单或复合的列。
您引用的教科书使用该术语来指代不同的东西,其中theta是一个结合比较的布尔表达式。这让人想起复杂条件下的SQL INNER JOIN。对于Codd来说,它是:
RB-24 Theta-Join的布尔扩展
观察引用的教科书的theta-join不是代数运算符(将参数值映射到结果值)!它是非终端语言(比较表达式不表示值)。教科书实际上没有定义足够的代数运算符来实现其代数式查询语言。据称,一组基本代数运算符包括select,但实际上它只定义为非终端语言,因为一个操作数是一个条件表达式。
(这种邋is是典型的关系型数据库教科书。在关系数据库领域存在着模糊和混乱的文化。这个领域就像Codd一样。)