如果基于日期范围的另一个表中存在记录,则从一个表中选择最后一个日期?

时间:2014-08-09 06:38:36

标签: sql

我正在尝试收集付款背后的任何记录,并希望在一次查询中执行此操作。

这是抓取上次付款的查询:

SELECT t1.trans_code, t1.date, t1.balance, t1.amount
FROM trans T1
WHERE t1.date = 
    (SELECT max(date)
     FROM  trans T2
     WHERE T1.fileno = T2.fileno)
  AND T1.trans_code = 'PAY'
ORDER BY fileno

这是抓取候选人名单的查询:

SELECT d.fileno, d.date, d.days, d.enddate, 
d.todo, m.def_fname, m.def_lname, a.addr, a.city, a.state, a.zip
FROM address AS a,
    diary AS d,
    main AS m
WHERE (m.fileno = d.fileno
         AND m.fileno = a.fileno) 
  AND (a.addrcode ='def'
         AND d.initials = 'PAY' 
         AND d.date >= {08-21-2014} 
         AND d.date <= {9-21-2014}) 
ORDER BY m.fileno

如果在第二个查询中的第一个日期之后没有记录(在这种情况下为8/21),我只想要第二个查询的结果 - 这意味着他们错过了付款。

fileno是唯一的,在伪代码中,我的意图是:

从名为DIARY的表格中的日期x到日期y获取文件编号(fileno)和相应信息(名称,地址等)的列表,如果在日期x之后此文件编号不存在付款,则仅返回这些结果(在这种情况9-21-2014)在表TRANS。表ADDRESS保存每个文件编号的地址。

希望我解释得很好 - 我不认为我的SQL足以组合这两个查询。提前致谢

1 个答案:

答案 0 :(得分:0)

请试试这个:

SELECT
      d.fileno
    , d.date
    , d.days
    , d.enddate
    , d.todo
    , m.def_fname
    , m.def_lname
    , a.addr
    , a.city
    , a.state
    , a.zip
FROM address AS a
      INNER JOIN main AS m
                  ON a.fileno = m.fileno
      INNER JOIN diary AS d
                  ON m.fileno = d.fileno
WHERE a.addrcode = 'def'
      AND d.initials = 'PAY'
      AND d.date >= '2014-08-21'
      AND d.date <= '2014-09-21'

      --  if no record exists after the "from" date above 
      AND NOT EXISTS (
                        SELECT
                              NULL
                        FROM trans
                        WHERE trans.fileno = a.fileno
                              AND trans.trans_code = 'PAY'
                              AND trans.date > '2014-08-21'
                    )
ORDER BY
      m.fileno

注意我使用了标准的SQL连接语法,前者&#34;第一个&#34;查询现在被修改(相当多)到NOT EXISTS条件。此查询不需要汇总,只是在提供的日期之后查找是否存在付款。

哦,有些人更喜欢在这些存在的查询中使用select null,但select 1甚至select *都可以作为替代方案。