当前位置: 首页 > 面试题库 >

SQL-表别名范围

范玄裳
2023-03-14
问题内容

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

 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有效?

非常感谢


问题答案:

它特定于每个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. 是的


 类似资料:
  • 通过使用 SQL,可以为表名称或列名称指定别名。 SQL 别名 通过使用 SQL,可以为表名称或列名称指定别名。 基本上,创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法SELECT column_name AS alias_name FROM table_name; 表的 SQL 别名语法SELECT column_name(s) FROM table_name AS alias_n

  • 问题内容: 我已经在各种DBMS(Oracle,SQL Server,MySQL,Access等)上编写SQL已有多年了,而一直困扰着我的一件事是,表和子目录似乎缺乏命名约定。查询别名。 我一直都读过表别名是解决问题的方法,尽管我并不总是使用它们,但是当我这样做时,我总是会卡在要使用的名称之间。我已经从使用描述性名称变为单个字符,例如“ t”,“ s”或“ q”,然后再返回。以我刚刚编写的此MS

  • 问题内容: 我在用多个JOIN进行查询时注意到,除非给表名之一指定别名,否则查询将无法工作。 这是一个简单的例子来说明这一点: 这 不起作用 : 这样 做 : 有人可以解释吗? 问题答案: 您在查询中使用同一个表购买两次。您需要通过提供不同的名称来区分它们。 您需要提供一个别名: 想象两个人有完全相同的约翰·多伊。如果您致电John,双方都会回复您的电话。您不能给两个人使用相同的名字,并假设他们会

  • 问题内容: 有人知道为什么这对两个表别名“ x”都有效吗? 我知道ID为5的JOIN没有任何意义… 感谢您的教训! 问题答案: 下面的前两个查询是等效的。在连接的子句中,表别名仅指使用该别名的最后一个表,因此仅表受到限制。 在和表达式中,别名引用两个表-因此,列名是唯一的,则可以成功引用它们,但是,在列名相同的情况下,oracle会引发异常(如果删除了注释,则在查询3中会发生这种情况)。 我找不到

  • 我试图创建一个抽象层来模拟Oracle 11g中的DB2函数。目标是让当前运行DB2查询的客户重新指向Oracle抽象层,而无需更改其语法。 我在ABC模式下创建了以下函数: 当我试图在SQL语句中使用它时,会出现一个错误: 如果我显式地调用模式,它会工作: 我还有一个登录触发器,可以显式地将会话的当前_模式设置为ABC。我能看到的唯一复杂之处是,时间戳在Oracle中是一个关键字,但它允许我用这

  • 主要内容:语法,示例SQL 允许对表进行重命名。有时候我们为表使用了无意义的名称,因此需要更正。 语法 SQL 支持两种重命名表的方式: ALTER TABLE old_table_name  RENAME TO new_table_name;  RENAME old_table _name TO new_table_name; old_table_name 为旧的表名,new_table_name 为新的表名。 示