我有下表:
表1
id
name
number
status
表2
id
table1_id
transaction_no
transaction_date
我想返回一个table1.name,table1.num,table2.transaction_no的列表,其中table1.status =“ Active”,而最新的table2.transaction_date早于4个月。
我一直在尝试类似的方法,但是语法在各个地方都失败了。
SELECT tab1.name, tab1.num, tab2.transaction_no
FROM table1 AS tab1
INNER JOIN table2 AS tab2 ON tab1.id = tab2.table1_id
WHERE tab1.status = "Active"
AND
(SELECT MAX(tab2.transaction_date) FROM tab2
GROUP BY tab1.name) <= (date 4 months ago)
我知道这是不对的,但是我的大脑正在努力地解决这个想法,或者我使它变得更加复杂。任何建议或指导将不胜感激。
答案 0 :(得分:1)
GROUP BY tab1.name
在您的子查询中没有意义。 tab1
不在您的子查询的上下文中(对此也不tab2
)。相反,尽管您可以执行相关的子查询:
AND (SELECT MAX(t2.transaction_date) FROM table2 t2 WHERE t2.table1_id = tab1.id) <= (date 4 months ago)
现在,子查询可以独立存在,并通过WHERE子句将其与主查询正确关联。
如果您只想要最新的t2记录(并且必须在4个月前),那么FROM子句中的子查询将起作用:
SELECT tab1.name, tab1.num, tab2.transaction_no
FROM table1 AS tab1
INNER JOIN (
SELECT transaction_no, table1_id
FROM table2 t2
WHERE transaction_date = (SELECT max(transaction_date) FROM table2 WHERE table1_id = t2.table1_id)
) AS tab2
ON tab1.id = tab2.table1_id
WHERE tab1.status = "Active";
在这里,我们仍在使用相关子查询来从table2中抓取每个table1_id具有最大transaction_date的记录。然后,我们将每个table1_id的一条记录重新加入table1.id。