【问题标题】:Workaround for using alias in where clause:oracle10g在 where 子句中使用别名的解决方法:oracle10g
【发布时间】:2011-07-10 16:15:04
【问题描述】:

我有一个这样的查询: select data.* from ((select table1.col1 as "a") union (select table2.col2 as "b")) data where 1 =1

如果我希望在“a”列上进行过滤,如何添加 where caluse?我知道我不能使用别名,但是我该如何编写 where 子句呢? 我试过了:

选择数据。*
从 (
   选择 table1.col1 作为“a”
   联盟
   选择 table2.col2 作为“b”
)
1 = 1 的数据
 和 data.a = 'someValue'

还有:

选择数据。* 从 ( 选择 table1.col1 作为“a” 联盟 选择 table2.col2 作为“b” ) 数据 其中 1 = 1 和 data.table1.col1 = 'someValue'

两个都报错

【问题讨论】:

    标签: sql oracle oracle10g


    【解决方案1】:

    Oracle 中的所有选择都需要一个 FROM 子句:

    select data.* 
      from ((select 1 as a FROM dual) union 
            (select 2 as b FROM dual)) DATA 
     where 1 = 1 
       and data.a = '1'
    

    在我的示例中将您的表名替换为 dual(仅用于基本语法和完整性检查)。

    此外,除非您需要将别名小写,否则在别名中省略双引号会更容易,以避免在引用别名的任何地方都使用双引号。

    【讨论】:

    • 在 OP 的情况下,它大概是 select table1.col1 as "a" FROM table1?
    【解决方案2】:

    除了正确所说的 DBCookie(我假设内部查询中的缺失只是复制和粘贴错误):

    具有别名data 的派生表只有一个列,该列由联合中第一个 SELECT 的列名确定。此列称为"a"(不是a),因为引号现在区分大小写。

    如果您不坚持使用小写的列名,则只需省略内部查询中的引号即可。

    选择数据。* 从 ( 选择 col1 作为 从表 1 联盟 选择 col2 --- 你可以在这里省略别名,它没用。 从表 2 ) WHERE data.a = 'someValue' - 我删除 1=1 因为它没有任何用途

    如果您坚持将别名放在引号中,则也必须在 WHERE 子句中使用它们:

    WHERE 数据。"a" = 'someValue'

    但这也会过滤掉来自 table2 并在 col2 中有“someValue”的值。我不确定这是否是您的意图。如果您想要过滤掉来自 table1 并在 col1 中有“someValue”的行,那么您需要将该条件放入联合:

    选择数据。* 从 ( 选择 col1 作为 从表 1 其中 col1 = 'someValue' 联盟 选择 col2 从表 2 ) 数据

    如果您确定 table1 和 table2 之间没有重复,我推荐 UNION ALL 而不是 UNION,因为这样更快。

    【讨论】:

    • +1:在外部 WHERE 子句中应用条件意味着处理两个表的结果——浪费资源。
    • 我的观点更针对结果的差异,而不是性能方面。无论如何,我认为它不会在性能方面产生影响,因为 Oracle 优化器足够聪明,可以将条件应用于内部选择而不是整体结果
    猜你喜欢
    • 2010-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2011-03-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多