繁体   English   中英

WHERE子句中的DB2别名

[英]DB2 alias in WHERE clause

我有几个DB2表,一个用于users ,一个用于newsletters ,我想在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子句之前执行,因此在尝试使用别名时该别名不存在。

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

尝试

WHERE timestamp(b.tech_id) < current_timestamp

SQL子句的通用“执行顺序”是

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

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

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

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

这将使您从新闻简讯中仅获得一行,并且使用DESCending顺序将给您“最新的”信息,前提是timestamp(tech_id)如所述。

要获取用户的最新新闻,请考虑对联接查询进行排序,然后选择顶部记录(在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的条件,因为存储在数据库中的数据将始终小于当前时间(即现在)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM