WHERE 子句中的 DB2 别名

DB2 alias in WHERE clause

我有几个 DB2 表,一个用于 users,一个用于 newsletters,我想 select 在 WHERE 子句中使用别名。

SELECT a.*, b.tech_id as user FROM users a  
JOIN newsletter b ON b.tech_id = a.newsletter_id
WHERE timestamp(user) < current_timestamp

这从根本上简化了,所以我可以看到发生了什么,但我收到一个错误,让我认为 user 别名没有正确传递:

ERROR: An invalid datetime format was detected; that is, an 
invalid string representation or value was specified. 

user.tech_id 是在创建记录时从 datetime 构建的字符串,因此它看起来像 20150210175040951186000000。我已经验证我可以成功执行 timestamp(tech_id)——所以它不可能是导致问题的字段格式。

有什么想法吗?

更多信息:

每个用户有多个简报。我需要获取最新的时事通讯(由 tech_id 发布)并检查它是否是在过去一周内创建的。所以更复杂的版本应该是这样的:

SELECT a.*, b.tech_id as user FROM users a  
JOIN newsletter b ON b.tech_id = a.newsletter_id
WHERE timestamp(max(user)) < current_timestamp

有没有办法 JOIN 只在最近的记录上?

执行顺序和写入顺序不一样。 FROM & WHERE 子句在 SELECT 子句之前执行,因此当您尝试使用别名时别名不存在。

您必须 "nest" 查询的一部分,以便在 where 子句之前定义别名。在许多情况下不使用别名会更容易。

尝试

WHERE timestamp(b.tech_id) < current_timestamp

SQL 子句的通用 "order of execution" 是

FROM
   JOINs (as part of the from clause)
WHERE
GROUP BY
HAVING
SELECT
ORDER BY

有没有办法只在最近的记录上加入?

一个有用的技术是使用 ROW_NUMBER() 假设您的 DB2 支持它,并且看起来像这样:

SELECT
      a.*
    , b.tech_id AS techuser
FROM users a
JOIN (
      SELECT
            *
          , ROW_NUMBER() OVER (ORDER BY timestamp(tech_id) DESC) AS RN
      FROM newsletter
) b
      ON b.tech_id = a.newsletter_id
      AND b.rn = 1

这只会给您简报中的一行,并且使用降序顺序给您 "most recent" 假设时间戳 (tech_id) 按照描述的方式工作。

要获取用户的最新新闻通讯,请考虑对连接查询进行排序,然后是 select 最高记录(在 DB2 中您将使用 FETCH FIRST ONLY):

SELECT a.*, b.tech_id as user 
  FROM users a  
INNER JOIN newsletter b ON b.tech_id = a.newsletter_id
ORDER BY b.tech_id
FETCH FIRST 1 ROW ONLY;

或者,您可以在 WHERE 子句中使用子查询来聚合最大用户:

SELECT a.*, b.tech_id as user 
  FROM users a  
WHERE b.tech_id IN (
  SELECT Max(n.tech_id) as maxUser
  FROM users u 
  INNER JOIN newsletter n ON n.tech_id = u.newsletter_id)

我省略了 timestamp(user) < current_timestamp 的条件,因为存储在数据库中的数据总是小于当前时间(即现在)。