【问题标题】:Combining Table Aliases with "Where" in Informix在 Informix 中将表别名与“Where”结合起来
【发布时间】:2011-07-02 12:52:02
【问题描述】:

我在使用带有 where 部分的 Informix 上的表别名时遇到了严重问题。

这样我就可以跑了:

SELECT ColA, ColB 
  FROM Table1 AS TestTable

但是一旦我尝试这个:

SELECT ColA, ColB 
  FROM Table1 
 WHERE type = 'A' AS TestTable

..它不会工作。当我尝试使用 WHERE 部分连接表时,也会发生同样的情况。

我正在尝试优化来自 this Question 的查询,因此我尝试不使用临时表。

【问题讨论】:

  • 您不在 WHERE 子句中使用别名;大多数数据库甚至不允许在 WHERE 子句中使用 SELECT 中定义的别名。目前尚不清楚您期望发生什么。
  • 我遇到了这个问题,因为我尝试在原始问题上回答“DRapp”(上面的 c 链接)。很抱歉造成任何混乱。

标签: sql syntax informix where aliasing


【解决方案1】:

据我所知,在任何数据库系统中都不允许尝试在 Where 子句中使用别名。您可以使用 Select ... Into 将 Select 语句的结果推送到表中,如下所示:

Select ColA, ColB Into Table2
From Table1 As TestTable

但是,您需要使用单独的 SQL 语句才能在上面的示例中使用 Table2。另一种选择是使用我认为 Informix 支持的公用表表达式:

With Foo As
    (
    Select ColA, ColB
    From Table1 As TestTable
    )
Select ColA, ColB
From Foo

【讨论】:

    【解决方案2】:

    我假设您正在尝试获得与 Oracle 的内联视图等效的内容。语法是:

    select *
    from  
       TABLE(MULTISET(SELECT ColA, ColB 
      FROM Table1 
     WHERE type = 'A' )) T1
    join 
       TABLE(MULTISET(SELECT ColA, ColB 
      FROM Table2 
     WHERE type = 'Z' )) T2 on (t2.colA = t1.colA)
    

    【讨论】:

    • 你真的不需要 SELECT 语句周围的TABLE(MULTISET(...))。
    • TABLE(MULTISET(...)) 有什么用处?我只会使用SELECT * FROM (SELECT * FROM ...)
    【解决方案3】:

    您可以为选择列表中的列或 FROM 子句中的表(或子查询)设置别名。

    因此,你会写:

    SELECT ColA, ColB 
      FROM Table1 AS TestTable
     WHERE type = 'A'
    

    或者你会写:

    SELECT t.*, r.*
      FROM (SELECT ColA, ColB 
              FROM Table1 AS TestTable
             WHERE type = 'A'
           ) AS t
      JOIN AnotherTable AS r ON t.ColA = r.ColC
    

    请注意,在此查询中,名称 TestTable 实际上并未被使用。更复杂的子查询可能会使用别名(尽管我非常喜欢短别名——比别名的表名更短的别名)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 2015-12-03
      • 1970-01-01
      • 2013-09-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      相关资源
      最近更新 更多