小编典典

SQL-表别名范围

sql

我刚刚(昨天)学会了使用“存在”而不是“输入”。

 BAD
 select * from table where nameid in ( 
          select nameid from othertable where otherdesc =  'SomeDesc' )      
 GOOD
 select * from table t where exists ( 
          select nameid from othertable o where t.nameid = o.nameid and otherdesc =  'SomeDesc' )

我对此有一些疑问:

1)据我所知,解释是: “这样做更好的原因是,将只返回匹配的值,而不是建立大量可能的结果列表”
。这是否意味着虽然第一个子查询可能返回900个结果,但第二个子查询仅返回1(是或否)?

2)过去,我曾在RDBMS中抱怨:“只能检索前1000行”,第二种方法可以解决该问题吗?

3)第二个子查询中别名的范围是什么?…别名仅存在于括号中吗?

例如

 select * from table t where exists ( 
          select nameid from othertable o where t.nameid = o.nameid and otherdesc =  'SomeDesc' )      
 AND 
          select nameid from othertable o where t.nameid = o.nameid and otherdesc =  'SomeOtherDesc' )

也就是说,如果我使用相同的别名(对于表othertable的表为o),则在第二个“存在”中是否存在与第一个存在的任何问题?还是他们完全独立?

这是Oracle唯一相关的东西,还是对大多数RDBMS有效?

非常感谢


阅读 213

收藏
2021-04-17

共1个答案

小编典典

它特定于每个DBMS,并取决于查询优化器。一些优化器检测IN子句并将其翻译。

在我测试过的所有DBMS中,别名仅在()内部有效

顺便说一句,您可以将查询重写为:

select t.* 
from table t 
join othertable o on t.nameid = o.nameid 
    and o.otherdesc in ('SomeDesc','SomeOtherDesc');

并且,回答您的问题:

  1. 是的
  2. 是的
  3. 是的
2021-04-17