我正在尝试收集付款背后的任何记录,并希望在一次查询中执行此操作。
这是抓取上次付款的查询:
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足以组合这两个查询。提前致谢
答案 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 *
都可以作为替代方案。