[英]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.