我在思考Oracle SQL实现中内连接的语法,这里似乎有点不一致:
假设您有两个关系贷款(loan_number,branch_name,金额)和借款人(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;
即使我不知道上面的语法,我仍然认为它不一致。除了允许内部连接而没有连接条件之外,使用交叉连接关键字也没关系。交叉连接实际上是没有连接条件的内连接,为什么不将它表示为没有连接条件的内连接?
答案 0 :(得分:4)
我同意这不一致。
但我认为Oracle的实现是一件好事:
ON
部分是强制性的。CROSS JOIN
sytax。让我觉得不要100%保持一致 - 这有助于避免你的错误。
答案 1 :(得分:3)
SELECT *
FROM Loan
CROSS JOIN Borrower
没有不一致。
答案 2 :(得分:3)
Oracle还支持自然连接语法,该语法根据共享列名连接两个表。这适用于您的情况,因为两个表都有一个名为LOAN_NUMBER的列。
SELECT *
FROM Loan
NATURAL JOIN Borrower
现在,在这种情况下可以进行相同的论证,使用关键字natural是绝对不必要的。但是如果我们遵循逻辑,我们最终会遇到这样的情况,即该语句可以是交叉连接或自然连接,具体取决于列名:
SELECT *
FROM Loan
JOIN Borrower
这显然是不受欢迎的,只是因为将LOAN.LOAN_NUMBER重命名为LOAN_ID会改变结果集。
所以,你的答案是:消除歧义。
答案 3 :(得分:2)
这种表达内部联接的方式:
select * from loan, borrower where loan.loan_number = borrower.loan_number;
近20年来不推荐。保留它是因为它只是一个有效的表达式,恰好传达了一个内连接。我会集中精力使用更接近当前标准的版本,最大限度地减少误解和消除错误的可能性。