oracle的内部连接

     2023-02-24     146

关键词:

【中文标题】oracle的内部连接【英文标题】:inner joins in oracle 【发布时间】: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。 【参考方案1】:

我同意这是不一致的。

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

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

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

【讨论】:

我同意你的看法。交叉连接可能不是用户的意思,所以让他们明确说明他们想要什么。 你不必使用交叉连接,你可以在 1=1 上进行内连接。【参考方案2】:

SELECT *
FROM Loan
CROSS JOIN Borrower

没有不一致。

【讨论】:

【参考方案3】:

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

SELECT *
FROM Loan
NATURAL JOIN Borrower

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

SELECT *
FROM Loan
JOIN Borrower

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

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

【讨论】:

您的回答很有道理。但是,如果美学由我决定,我会将交叉连接定义为 select * from loan join borrower 并使用 natural 关键字表示自然连接。【参考方案4】:

这种表示内连接的方式:

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

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

【讨论】:

Oracle 从 9i 版本开始只支持 ANSI 92 连接语法。那是在 2001 年发布的,距离“近二十年”还差得很远。此外,问题是关于 ANSI 标准的 Oracle 实现中明显的不一致。

无法在 oracle 中实现此内部连接

】无法在oracle中实现此内部连接【英文标题】:cannotimplementthisinnerjoininoracle【发布时间】:2020-06-1306:16:24【问题描述】:我最近开始学习oracle,但我很难理解表上的这种内部连接。INSERTINTOtemp_bill_pay_ftSELECTDISTINCTft.ft_id,ft.ft_credit_a... 查看详情

oracle sql中的group by表达式的内部连接[重复]

】oraclesql中的groupby表达式的内部连接[重复]【英文标题】:innerjoinwithgroupbyexpressioninoraclesql[duplicate]【发布时间】:2013-03-3000:24:56【问题描述】:我是sql新手,感谢任何帮助。我有两张桌子,employees和jobs。employees包含一个变量job_... 查看详情

Oracle通过带有内部连接和返回n行的子查询的桥表选择查询?

】Oracle通过带有内部连接和返回n行的子查询的桥表选择查询?【英文标题】:Oracleselectqueryviabridgetablewithinnerjoinsandsubquerythatreturnsnnumberofrows?【发布时间】:2018-01-2321:20:36【问题描述】:我开发了一个遵循星型模式的数据仓库。... 查看详情

带有内部联接的 Oracle 更新语句

】带有内部联接的Oracle更新语句【英文标题】:OracleUpdatestatementwithanInnerJoin【发布时间】:2011-12-0115:13:19【问题描述】:我正在尝试使用内部连接编写一个简单的更新语句,但我在SQLServer中执行此操作的方式似乎不适用于ORACLE。... 查看详情

将外部选择行变量传递给oracle中的内部选择

】将外部选择行变量传递给oracle中的内部选择【英文标题】:passanouterselectsrowvariabletoinnerselectinoracle【发布时间】:2012-06-0621:18:19【问题描述】:如何在oracle中将外部选择行变量传递给内部选择,这是一个示例查询(其他外部连... 查看详情

在 Oracle 中使用连接语法连接 3 个以上的表

...法。现在我正在尝试弄清楚如何使用JOIN语法进行基本的内部连接,但无法弄清楚。假设我有3张桌子。员工:EmployeeIDEmployeeNameDepartmentID1JohnSmith22Jane 查看详情

PLSQL ORACLE:表变量之间的内连接

...:我需要在oracle中创建两个表类型变量并在它们之间进行内部连接。我无法在源数据库中创建临时表,因为我没有权限。如何在oracle中创建一个匿名plsql块,与SQLserver中的这段代码相关?DECLARE@TB_PROJETOT 查看详情

解决ora-00257:归档程序错误。在释放之前仅限于内部连接

...,报错,提示ORA-00257:归档程序错误。在释放之前仅限于内部连接通过查询,得知原因是archivedlog达到了数据库设置的空间限制。通过后台sqlplus登入数据库,执行命令:select*fromv$flash_recovery_area_usage查看ARCHIVEDLOG这一项的空间占用... 查看详情

在android应用程序中连接oracle

...尝试连接jdbc驱动程序时,它都会显示Dxwarning:忽略匿名内部类的InnerClasses属性(oracle.jdbc.pool.Or 查看详情

oracle如何查询当前连接用户的详细信息

...查询到进程对应的sessionUSER#-同于dba_users中的user_id,Oracle内部进程user#为0.USERNAME-session\'susername。等于dba_users中的username。Oracle内部进程的username为空。COMMAND-session正在执行的sqlid,1代表createtable,3代表select。TADDR-当前的transaction 查看详情

JVM 调试连接器内部结构和安全性

】JVM调试连接器内部结构和安全性【英文标题】:JVMdebugconnectorinternalsandsecurity【发布时间】:2019-09-0518:58:58【问题描述】:我最近遇到了一个问题:DebugajavaapplicationwithoutstartingtheJVMwithdebugarguments在https://docs.oracle.com/javase/7/docs/tec... 查看详情

流畅的 Nhibernate 内部连接

】流畅的Nhibernate内部连接【英文标题】:FluentNhibernateinnerjoin【发布时间】:2011-12-1612:43:09【问题描述】:我有3个表(Master、Imagen、Linea)是:MasterpublicvirtualintIdget;privateset;publicvirtualImagenimagenget;set;ImagenpublicvirtualintIdget;privateset 查看详情

oracle内部表x$kffxp为啥为空?(代码片段)

...内的数据映射出来,网上教授的方法是读取X$KFFXP这个内部表,获取ASM文件在磁盘中的AU编号,之后读取出数据。但我在实际操作中查询X$KFFXP却发现是一个空表。[root@RACnode1-p~]#su-oracle[oracle@RACnode1-p~]$sqlplus/assysdbaS... 查看详情

函数内部的错误参数(oracle)

】函数内部的错误参数(oracle)【英文标题】:Wrongargumentsinsidefunction(oracle)【发布时间】:2019-03-1107:54:00【问题描述】:我有基本功能:createorreplacefunctiont_owner(tnameinvarchar2,onameoutvarchar2)returnvarchar2isbeginselectownerintoonamefromtablewheret 查看详情

使用内部连接更新 [重复]

】使用内部连接更新[重复]【英文标题】:Updatewithinnerjoin[duplicate]【发布时间】:2012-12-0520:21:20【问题描述】:可能重复:UpdateatableusingJOINinSQLServer?我卡在一个非常简单的查询上,一个带有连接的更新,我想把RECORDTYPE字段中的REC... 查看详情

sqlserver的交叉连接和内部连接有啥区别吗?

...×n条记录,属性会有x+y个。而且这种连接比较消耗资源。内部连接:它是交叉连接的一个变形,内部连接一般都会有一个连接条件,只有满足条件的连接才会被选中。如果内部连接没有设置合理的条件,那它和交叉连接是等价的... 查看详情

你如何在mysql中结合内部和外部连接

】你如何在mysql中结合内部和外部连接【英文标题】:Howdoyoucombineaninnerandouterjoininmysql【发布时间】:2010-09-3005:06:52【问题描述】:我可以在sybase中完成,我可以在oracle中完成,但我没有看到如何在mysql中完成。我有这个:(请克... 查看详情

内部连接的慢 where 子句

】内部连接的慢where子句【英文标题】:Slowwhereclauseoninnerjoin【发布时间】:2014-08-1520:46:20【问题描述】:SELECTjourney.idFROMjourneyJOINjourney_dayONjourney_day.journey=journey.idJOINserviceONjourney.service=service.idJOINoperatorONoperator.id=se 查看详情