gpt4 book ai didi

sql - 左联接中的歧义(仅适用于Oracle?)

转载 作者:行者123 更新时间:2023-12-04 22:02:42 26 4
gpt4 key购买 nike

我的老板在我创建的查询中发现了一个错误,我不明白这个错误背后的原因,尽管查询结果证明他是正确的。这是修复之前的查询(简化版):

select PTNO,PTNM,CATCD
from PARTS
left join CATEGORIES on (CATEGORIES.CATCD=PARTS.CATCD);

这是修复后:
select PTNO,PTNM,PARTS.CATCD
from PARTS
left join CATEGORIES on (CATEGORIES.CATCD=PARTS.CATCD);

错误是,列 CATCD 显示了空值,即查询结果包括来自表 CATEGORIES 而不是 PARTS 的结果。
这是我不明白的:如果原始查询中有歧义,为什么 Oracle 不抛出错误?据我了解,在左连接的情况下,查询(PARTS)中的“主”表优先于歧义。
我错了,还是只是没有正确考虑这个问题?

更新:

这是一个修改后的示例,其中不引发歧义错误:
CREATE TABLE PARTS (PTNO NUMBER, CATCD NUMBER, SECCD NUMBER);

CREATE TABLE CATEGORIES(CATCD NUMBER);

CREATE TABLE SECTIONS(SECCD NUMBER, CATCD NUMBER);


select PTNO,CATCD
from PARTS
left join CATEGORIES on (CATEGORIES.CATCD=PARTS.CATCD)
left join SECTIONS on (SECTIONS.SECCD=PARTS.SECCD) ;

有人有线索吗?

最佳答案

恐怕我不能告诉你为什么你没有异常(exception),但是我可以推测为什么它选择了CATEGORIES版本的列而不是PARTS版本的列。

As far as I understood, in the case of left joins, the "main" table in the query (PARTS) has precedence in ambiguity



不清楚“主”是指左连接中的左表,还是“驱动”表,正如您在概念上看到的查询......但在任何一种情况下,您在您编写的查询不一定是该查询实际执行中的“主”表。

我的猜测是 Oracle 只是使用它在执行查询时遇到的第一个表中的列。而且由于 SQL 中的大多数单个操作不需要先命中一个表,DBMS 将在解析时决定首先扫描哪个是最有效的。尝试获取查询的执行计划。我怀疑它可能会显示它首先击中类别,然后击中零件。

关于sql - 左联接中的歧义(仅适用于Oracle?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58831/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com