我有这样的表A:
mydate kodetb amount
-----------------------------
2016-03-10 203 600
2016-03-11 203 100
2016-03-11 200 110
我有这样的表B
kodetb service
---------------
200 ok
203 not ok
我想显示如下结果:
kodetb mydate amount service
--------------------------------------
200 2016-03-11 110 ok
203 2016-03-10 100 not ok
显示第二行结果100,因为它具有最新/最大日期
请帮助
答案 0 :(得分:0)
以下查询工作正常。我已经在我的本地进行了测试,它提供了所需的输出。
SELECT tableA.kodetb,mydate,amount,service
FROM tableA, tableB
WHERE tableA.kodetb = tableB.kodetb
GROUP BY tableA.kodetb
HAVING MAX(mydate);
在您的表数据中,也不需要WHERE条件。但是,如果表中也存在非匹配数据,则需要匹配数据。
答案 1 :(得分:0)
您可以使用 JOIN 和 NOT EXISTS 。
<强>查询强>
select t1.kodetb, t1.mydate, t1.amount, t2.service
from tableA t1
join tableB t2
on t1.kodetb = t2.kodetb
where not exists(
select 1 from tableA t
where t.kodetb = t1.kodetb
and t.mydate > t1.mydate
)
order by t1.kodetb;
<强> SQL Fiddle demo 强>
答案 2 :(得分:0)
您可以使用相关的子查询来执行此操作,但这些都是非常低效的。
这种方式适用于连接,您必须使用表别名来标识没有更大值的记录(这是left outer
在这里所做的事情)。如果c.mydate是最大值,这个技巧会为你提供NULL
:
SELECT a.kodetb, a.mydate, a.amount, b.service
FROM tableA a INNER JOIN tableB b ON a.kodetb = b.kodetb
LEFT OUTER JOIN tableA c ON c.kodetb = a.kodetb AND c.mydate > a.mydate
WHERE c.mydate IS NULL
这是一个显示结果的小提琴:
http://sqlfiddle.com/#!9/3faee/16
这是一个棘手的查询,因为当你使用&#34;聚合&#34;比如MAX
(或SUM
或AVG
或其他),您需要GROUP BY
选择中的所有其他列。因此,如果您SELECT MAX(xdate), name, service FROM table
收到错误,因为xdate
是&#34;聚合&#34;并且您没有group by
列name
和service
答案 3 :(得分:-1)
这应该可以解决问题:
select tablea.kodetb, mydate, amount, tableb.service
from tablea
inner join tableb on tablea.kodetb = tableb.kodetb
order by mydate desc