Where子句影响join

wad*_*rld 5 sql oracle oracle10g

愚蠢的提问时间.Oracle 10g.

where子句是否可能影响连接?

我有以下形式的查询:

select * from
(select product, product_name from products p
join product_serial ps on product.id = ps.id
join product_data pd on pd.product_value = to_number(p.product_value)) product_result
where product_name like '%prototype%';
Run Code Online (Sandbox Code Playgroud)

显然这是一个人为的例子.没有必要显示表格结构,因为它是所有想象的.不幸的是,我无法显示真正的表结构或查询.在这种情况下,p.product_value是一个VARCHAR2字段,在某些行中有一个存储在其中的ID而不是文本.(是的,糟糕的设计 - 但我继承了一些东西,我无法改变)

问题在于加入.如果我省略where子句,查询将起作用并返回行.但是,如果我添加where子句,则会在pd.product_value = to_number(p.product_value)连接条件中出现"无效数字"错误.

显然,当连接的行包含p.product_value字段中的非数字时,会发生"无效数字"错误.但是,我的问题是这些行是如何被选中的?如果连接成功而没有外部where子句,那么外部where子句是否应该只从连接的结果中选择行?尽管联接在内部查询中,但似乎正在发生的事情是where子句正在影响哪些行被连接.

我的问题有意义吗?

jmo*_*eno 1

简短的回答:是的。

长答案:查询引擎可以随意重写您的查询,只要它返回相同的结果即可。所有查询都可供它使用,以生成最有效的查询。

在这种情况下,我猜测有一个索引涵盖了您想要的内容,但它不涵盖产品名称,当您将其添加到 where 子句时,不会使用索引,而是会扫描 where同时测试这两个条件,因此您的错误。

这确实是您的连接条件中的错误,除非您确定它是一个数字,否则您不应该使用 to_number 。