6

我正在考虑 Oracle 的 SQL 实现中内部连接的语法,这似乎有点不一致:

假设您有两个关系贷款(loan_number,branch_name,amount)和借款人(customer_name,loan_number)。loan_number 是两个表共有的属性。现在,Oracle 为您提供了两种表达内部联接的方法:

select * 
from loan, borrower 
where loan.loan_number = borrower.loan_number;

上面的语句等价于:

select * 
from loan 
     inner join borrower 
     on loan.loan_number = borrower.loan_number;

但是,在表达交叉连接时,只有一种表达方式:

select * 
from loan, borrower;

以下语句在语法上不正确:

select * 
from loan 
     inner join borrower; 

这是无效的;Oracle 期望子句的 ON... 部分

既然内连接只是一个带有过滤条件的交叉连接,你们认为这是Oracle SQL 实现的不一致吗?我错过了什么吗?我很想听听其他意见。谢谢。

正如大卫在他的回答中指出的那样,语法是:

select * 
from loan cross join borrower;

即使我不知道上述语法,我仍然认为它不一致。除了允许没有连接条件的内部连接之外,还可以使用交叉连接关键字。交叉连接实际上是没有连接条件的内连接,为什么不将其表示为没有连接条件的内连接呢?

4

4 回答 4

4

我同意这是不一致的。

但我认为 Oracle 实现是一件好事:

  • 当您进行连接时,您几乎总是希望包含过滤条件,因此该ON部分是强制性的。
  • 如果你真的,真的不想有一个过滤条件(你真的确定吗?),你必须用CROSS JOINsytax 明确地告诉 Oracle。

对我来说,不要 100% 一致是很有意义的——它有助于避免你的错误。

于 2009-11-22T17:55:04.990 回答
3

SELECT *
FROM Loan
CROSS JOIN Borrower

没有不一致。

于 2009-11-22T04:34:50.233 回答
3

Oracle 还支持自然连接语法,它根据共享列名连接两个表。这适用于您的情况,因为两个表都有一个名为 LOAN_NUMBER 的列。

SELECT *
FROM Loan
NATURAL JOIN Borrower

现在,您可以在这种情况下提出相同的论点,即关键字 natural 的使用是完全没有必要的。但是如果我们遵循逻辑,我们最终会遇到这样一种情况,即该语句可能是交叉连接或自然连接,具体取决于列名:

SELECT *
FROM Loan
JOIN Borrower

这显然是不可取的,因为将 LOAN.LOAN_NUMBER 重命名为 LOAN_ID 会改变结果集。

所以,这就是你的答案:消除歧义。

于 2009-11-22T07:23:24.393 回答
2

这种表达内连接的方式:

select * from loan, borrower where loan.loan_number = borrower.loan_number;

近 20 年不推荐。之所以保留它,是因为它只是一个恰好传达内部连接的有效表达式。我会专注于使用更接近当前标准的版本,最大限度地减少误解和彻底错误的机会。

于 2009-11-22T04:49:19.357 回答