在此查询中,我需要显示左表中的所有记录,并且只显示右表中所有结果为最高日期的记录。从第二个表中只加入一行,如果不存在行返回null
目前查询:
SELECT a.*, c.*
FROM users a
INNER JOIN payments c
ON a.id = c.user_ID
INNER JOIN
(
SELECT user_ID, MAX(date) maxDate
FROM payments
GROUP BY user_ID
) b ON c.user_ID = b.user_ID AND
c.date = b.maxDate
WHERE a.package = 1
这将返回所有记录中,其中加入是有效的,但我要显示所有用户,如果他们没有付款尚未从支付表中的字段为空。
我可以用一个工会来显示其他行:
SELECT a.*, c.*
FROM users a
INNER JOIN payments c
ON a.id = c.user_ID
INNER JOIN
(
SELECT user_ID, MAX(date) maxDate
FROM payments
GROUP BY user_ID
) b ON c.user_ID = b.user_ID AND
c.date = b.maxDate
WHERE a.package = 1
union
SELECT a.*, c.*
FROM users a
--here I would need to join with payments table to get the columns from the payments table,
but where the user doesn't have a payment yet
WHERE a.package = 1
选择使用工会似乎并不像一个很好的解决方案,但是这是我的尝试。
我有12c,所以他的答案有效。但我喜欢你的方法+1 – davejal