在子查询中获取单个记录

时间:2015-08-27 23:51:40

标签: sql db2

我有一个包含多个user记录的DB2数据库,这些记录通过几个中间表与newsletter记录相关。

我的问题是我需要只是他们收到的最新newsletter用户在上周。几个小时以来,我一直在敲打着我的脑袋,仍然没有找到一种方法来干净地获得我需要的记录。我认为这将是解决方案,但我一直遇到非常一般的错误,我不太了解原因。

SELECT a.*, d.tech_id as newsletter FROM users a 
JOIN user_profile b ON b.tech_id = a.profile_id
JOIN user_contact c ON c.user_id = b.tech_id
JOIN (
    SELECT newsletters.tech_id, ROW_NUMBER() OVER (ORDER BY timestamp(tech_id) DESC) AS RN
      FROM NEWSLETTERS
) d ON d.tech_id  = c.newsletter_id
WHERE (timestamp(d.rn) < current_timestamp - 7 days)

有更好的方法可以做到这一点,还是我错过了一个明显的问题?

编辑:

这就是我想要做的事情,虽然它也不能正常工作:

SELECT a.* as newsletter FROM users a 
WHERE (
   SELECT MAX(timestamp(newsletters.tech_id))
   FROM newsletters
   WHERE newsletters.tech_id IN(
      SELECT newsletter_id FROM user_contact WHERE user_contact.profile_id = a.tech_id
   )
) < current_timestamp - 7 days

结构非常简单。 users表的外键为profile_id,其键入user_profile.tech_iduser_contact.user_id字段是user_profile.tech_id的关键字。 user_contact表有一个名为user_contact.newsletter_id的外键,键入newsletters.tech_id

2 个答案:

答案 0 :(得分:0)

RN是根据列的最新时间戳生成的行号。不应将其与最终where子句中的日期进行比较。但是,在row_number函数中,如果timestamp(tech_id)不是tech_id数据类型,那么您按datetime排序将无法按预期工作。

根据您的要求,不需要row_number

尝试以下查询。

SELECT a.*, d.tech_id as newsletter
FROM users a 
JOIN user_profile b ON b.tech_id = a.profile_id
JOIN user_contact c ON c.user_id = b.tech_id
JOIN NEWSLETTERS d ON d.tech_id  = c.newsletter_id
WHERE (timestamp(d.datecolumn) < current_timestamp - 7 days)
--change the d.datecolumn to the datetime column in the table

答案 1 :(得分:0)

您似乎需要使用GROUP BY。尝试这样的事情:

SELECT a.*
FROM users a
JOIN (
   SELECT d.tech_id as newsletter, MAX(d.datecol) 
   FROM user_profile b
   JOIN user_contact c ON c.user_id = b.tech_id
   JOIN NEWSLETTERS d ON d.tech_id  = c.newsletter_id
   WHERE (timestamp(d.datecol) < current_timestamp - 7 days)
   GROUP BY d.tech_id
) e ON e.tech_id = a.profile_id