首页 > 解决方案 > SQL 错误 [IX000]:在查询的任何表中都找不到列 (t)(或 SLV 未定义)

问题描述

我想依靠我的表 tab1的列val的值,其中日期是 '04/03/2012'。

代码

SELECT COUNT(DISTINCT val) FROM (
select val, dbinfo('utc_to_datetime', nbr_seconds) as X.t from tab1
 where X.t> '2012-03-02' and  X.t < '2012-03-05' and val>10) X; 

我收到此错误SQL 错误 [IX000]: Column (t) not found in any table in the query (or SLV is undefined)

请问有人知道怎么解决吗?

标签: sqlinformix

解决方案


有两个问题:

  1. 选择列表中的列别名无法在 WHERE 子句中引用(这就是t找不到的原因)。
  2. 当您修复它时,将找不到日期部分同时在给定日期之前和之后的行 - 2012-03-04;你需要一个相等操作。

有多种方法可以解决这个问题。一个相当简单的改变:

SELECT COUNT(DISTINCT val)
  FROM (SELECT val, dbinfo('utc_to_datetime', nbr_seconds) AS t FROM tab1) AS x
 WHERE EXTEND(x.t, YEAR TO DAY) = DATETIME('2012-03-04') YEAR TO DAY
   AND x.val > 10;

子选择生成一个x包含列val和的表t,然后主查询过滤结果。EXTEND 调用丢弃 中的值的时间部分x.t,以及与 的比较'2012-03-04'。优化器可能能够将 WHERE 子句中的条件下推到子选择中——val条件可以很容易地移动,但时间条件并不那么容易。

另一种方法是将一天的开始和结束时间转换为 Unix 时间,并在子查询中进行比较(这变得不必要)。有关函数,请参阅在 Informix 中将 DATETIME 转换为 Unix 纪元tounixtime()

SELECT COUNT(DISTINCT val)
  FROM tab1
 WHERE nbr_seconds >= tounixtime(DATETIME(2012-03-04) YEAR TO DAY)
   AND nbr_seconds <  tounixtime(DATETIME(2012-03-04) YEAR TO DAY + 1 UNITS DAY)
   AND val > 10;

当一个DATETIME YEAR TO DAY值扩展为DATETIME YEAR TO SECOND时,时间分量设置为 0。

警告:未经测试的代码——概念是正确的,但可能存在语法错误。


推荐阅读