【发布时间】:2010-12-19 04:00:54
【问题描述】:
我在考虑 Oracle 的 SQL 实现中的内连接语法,这似乎有点不一致:
假设您有两个关系loan(loan_number, branch_name, amount) 和borrower(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;
即使我不知道上面的语法,我仍然认为它不一致。除了允许没有连接条件的内部连接之外,还可以使用交叉连接关键字。交叉连接实际上是没有连接条件的内连接,为什么不将其表示为没有连接条件的内连接呢?
【问题讨论】:
-
(a) 因为这是 SQL 标准定义它的方式,并且 (b) 因为 CROSS JOIN 不包含不在两个单独表中的信息,所以通常(但不总是)浪费,并且应该需要特殊的语法来调用“浪费”的资源。
-
正如 Jonathan Leffler 所说,SQL 标准明确定义了交叉连接。您在那里做了一个假设,交叉连接是内部连接的一种特殊形式。
-
@jhartelt 交叉连接和内连接都是笛卡尔积,但内连接过滤了结果。
-
CROSS JOIN 语法用于明确声明您需要笛卡尔积。
-
"inner join without a condition"没有任何意义,因为inner join有条件。你的意思可能是没有过滤的时候是inner join,也就是inner join on true,也就是cross join。
标签: sql database oracle inner-join join