Sql oracle中的内部连接

Sql oracle中的内部连接,sql,database,oracle,inner-join,join,Sql,Database,Oracle,Inner Join,Join,我在考虑Oracle SQL实现中内部联接的语法,这里有一些似乎有点不一致: 假设您有两个关系:贷款(贷款编号、分行名称、金额)和借款人(客户名称、贷款编号)。loan_number是两个表的共同属性。现在,Oracle为您提供了两种表示内部联接的方法: select * from loan, borrower where loan.loan_number = borrower.loan_number; 上述声明相当于: select * from loan inner jo

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

假设您有两个关系:贷款(贷款编号、分行名称、金额)和借款人(客户名称、贷款编号)。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的SQL实现中是不一致的吗?我错过什么了吗? 我想听听其他的意见。谢谢

正如David在回答中指出的,语法是:

select * 
from loan cross join borrower;
即使我不知道上面的语法,我仍然认为它是不一致的。除了允许没有连接条件的内部连接外,还可以使用cross-join关键字。交叉连接实际上是没有连接条件的内部连接,为什么不将其表示为没有连接条件的内部连接呢


SELECT *
FROM Loan
CROSS JOIN Borrower

没有不一致性。

这种表达内部联接的方式:

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

近20年内不推荐使用。之所以保留它,是因为它只是一个恰好传递内部联接的有效表达式。我将集中精力使用更接近当前标准的版本,以最大限度地减少误解和完全错误的机会。

Oracle还支持自然联接语法,该语法基于共享列名联接两个表。这在您的情况下是可行的,因为两个表都有一个名为LOAN_NUMBER的列

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

SELECT *
FROM Loan
JOIN Borrower
如果只是因为将LOAN.LOAN_NUMBER重命名为LOAN_ID会更改结果集,那么这显然是不可取的


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

我同意这是不一致的

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

  • 在执行联接时,几乎总是希望包含筛选条件,因此上的
    部分是必需的
  • 如果你真的不想有一个过滤条件(你真的确定吗?),你必须用
    CROSS-JOIN
    sytax明确地告诉Oracle

对我来说,保持100%的一致性很有意义——这有助于避免错误。

(a)因为这是SQL标准定义它的方式,(b)因为交叉连接不包含不在两个单独表中的信息,通常(但不总是)是浪费的,并且应该需要特殊的语法来调用“浪费”的资源。您在那里做了一个假设,关于交叉连接是内部连接的一种特殊形式。@jhartelt交叉连接和内部连接都是笛卡尔乘积,但内部连接过滤结果。交叉连接语法用于明确说明您想要笛卡尔乘积。“无条件的内部连接”没有任何意义,因为内部连接有一个条件。在没有过滤的情况下,这可能意味着它是内部联接,即true上的内部联接,即交叉联接。自9i版本以来,Oracle仅支持ANSI 92联接语法。这是在2001年发布的,距离“近二十年”还差得远。此外,问题是关于Oracle对ANSI标准的实施中存在明显的不一致性。你的回答很有道理。但是,如果美学由我决定,我会让交叉连接定义为select*from loan join BROKER,并使用自然关键字表示自然连接。我同意你的看法。交叉连接可能不是用户的意思,所以让他们明确地说出他们想要什么。你不必使用交叉连接,你可以在1=1时进行内部连接。