首页 文章

oracle中的内连接

提问于
浏览
5

我在考虑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;

即使我不知道上面的语法,我仍然认为它不一致 . 除了允许内连接而没有连接条件之外,使用交叉连接关键字也没关系 . 交叉连接实际上是没有连接条件的内连接,为什么不在没有连接条件的情况下将其表示为内连接?

4 回答

  • 3

    这种表达内连接的方式:

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

    不推荐使用近20年 . 保留它是因为它只是一个有效的表达式,恰好传达了一个内连接 . 我会集中精力使用更接近当前标准的版本,最大限度地减少误解和消除错误的可能性 .

  • 3

    我同意这不一致 .

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

    • 当您进行连接时,您几乎总是希望包含过滤条件,因此 ON 部分是必需的 .

    • 如果你真的,真的不想有过滤条件(你真的确定吗?),你必须用 CROSS JOIN sytax明确告诉Oracle .

    对我来说很有意义,不要100%保持一致 - 这有助于避免你的错误 .

  • 4
    SELECT *
    FROM Loan
    CROSS JOIN Borrower
    

    没有矛盾 .

  • 2

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

    SELECT *
    FROM Loan
    NATURAL JOIN Borrower
    

    现在,在这种情况下可以进行相同的论证,使用关键字natural是绝对不必要的 . 但是如果我们遵循逻辑,我们最终会遇到这样的情况,即该语句可以是交叉连接或自然连接,具体取决于列名:

    SELECT *
    FROM Loan
    JOIN Borrower
    

    这显然是不合需要的,只是因为将LOAN.LOAN_NUMBER重命名为LOAN_ID会改变结果集 .

    所以,有你的答案:消除歧义 .

相关问题