sql - 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)
请问有人知道怎么解决吗?
解决方案
有两个问题:
- 选择列表中的列别名无法在 WHERE 子句中引用(这就是
t
找不到的原因)。 - 当您修复它时,将找不到日期部分同时在给定日期之前和之后的行 - 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。
警告:未经测试的代码——概念是正确的,但可能存在语法错误。
推荐阅读
- twilio - Twilio API 导出子帐户
- asp.net-mvc - 剑道甘特时间线以 30 分钟为增量?
- r - 将每个主题的输出指定为特定数量的单词
- cryptography - SHA3 函数属性
- laravel - Heroku Laravel 500(内部服务器错误)oauth-public.key 不存在
- reactjs - 如何在 React js 中正确设置状态
- python - 如何在读取任何使用“utf-8”编码的文件时找到抛出 UnicodeDecodeError 的字符
- python - 为什么“真或真假”这句话是真的?
- java - 使用来自 java spring boot 的入口 url 连接 redis
- go - 如何在本地服务 go-swagger?