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
的条件,因为存储在数据库中的数据总是小于当前时间(即现在)。
我有几个 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
的条件,因为存储在数据库中的数据总是小于当前时间(即现在)。