自然连接不应该有条件。
这个关系代数是如何翻译成 SQL 的?
σ SupplierId=’Datec’ (r(Asset) * r(Supplier))
连接
(r(Asset)*r(Supplier))
位于括号内。该子表达式产生一个关系。
选择/限制
σSupplierId=’Datec’( ... )
位于括号之外。它不关心括号内应用什么操作,只要它们产生关系即可。
所以 Join 没有“有条件”。这是具有条件的整体查询。
需要帮助将其转换为 SQL
我需要警告的是,关系代数有很多种,其中大多数的语义与 SQL 并不完全对应。特别是具有可为空列的表之间的联接往往会很糟糕。但是
SELECT UNIQUE *
WHERE SupplierId = 'Datec'
FROM Asset NATURAL JOIN Supplier
顺便说一句,大多数 SQL 供应商尚未实现
NATURAL JOIN
和/或在如何使用它方面存在特定于供应商的限制。请参阅供应商的文档。
所谓的
natural join
运算符一点也不“自然”。 它有条件——只是没有明确地显示出来。
条件是两个表中任何同名列之间的相等匹配。 当存在此类列时,“自然”连接相当于
inner join
,或者如果您包含 left
、right
或 full
关键字,则相当于外连接。
如果不存在同名的列,则“自然”连接相当于
cross join
。 当然,cross join
实际上是一个具有 inner join
条件的 1=1
。
请注意,自然连接不会考虑正确声明的外键关系,这就是为什么我认为它根本不是“自然”的。