1

为什么我得到重复?看起来很简单,但它并没有穿过我厚厚的头骨。

SELECT MOPACTIVITY.MOPID STRICT,
    TO_CHAR(MOPNOTES.MOPNOTEDATE, 
              'yyyy-mm-dd hh24:mi') "MOPNOTEDATE"
FROM MOPUSER.MOPACTIVITY
   INNER JOIN MOPUSER.MOPNOTES 
       ON MOPACTIVITY.MOPID=MOPNOTES.MOPID

如何仅将一条子记录发送给父母,而子记录是 MOPNOTES.MOPNOTEDATE 的最新记录?

4

4 回答 4

3

尝试分组,并使用最大值:

SELECT MOPACTIVITY.MOPID STRICT,
       TO_CHAR(max(MOPNOTES.MOPNOTEDATE), 'yyyy-mm-dd hh24:mi') "MOPNOTEDATE"
FROM MOPUSER.MOPACTIVITY
INNER JOIN MOPUSER.MOPNOTES ON MOPACTIVITY.MOPID=MOPNOTES.MOPID
GROUP BY MOPACTIVITY.MOPID
于 2013-06-07T19:09:23.440 回答
3

如果您只需要来自 的那些列MOPNOTES,那么应该这样做:

SELECT MOPACTIVITY.MOPID STRICT,
       TO_CHAR(MN.MOPNOTEDATE, 
              'yyyy-mm-dd hh24:mi') "MOPNOTEDATE"
FROM MOPUSER.MOPACTIVITY
INNER JOIN (SELECT MOPID, MAX(MOPNOTEDATE) AS "MOPNOTEDATE"
            FROM MOPUSER.MOPNOTES 
            GROUP BY MOPID) MN
    ON MOPACTIVITY.MOPID=MN.MOPID
于 2013-06-07T18:57:30.523 回答
2

您的评论显着改变了问题。这是您要使用分析函数的地方。这是一个例子:

SELECT ma.MOPID as STRICT,
       TO_CHAR(mn.MOPNOTEDATE, 'yyyy-mm-dd hh24:mi') as "MOPNOTEDATE"
FROM MOPUSER.MOPACTIVITY ma INNER JOIN
     (select mn.*,
             MAX(mn.MOPNOTEDATE) over (partition by mn.MOPID ) as maxMOPNOTEDATE
      from MOPUSER.MOPNOTES mn
     ) mn
    ON ma.MOPID = mn.MOPID and ma.MOPNOTEDATE = mn.maxMOPNOTEDATE;

max()with的使用over使它成为一个分析函数。这将获得每个 的最大值MOPID。该on子句仅选择与最大值匹配的记录。

请注意,如果存在具有相同最新时间戳的重复项,则将全部包括在内。

于 2013-06-07T19:05:45.370 回答
0
SELECT 
    DISTINCT
    MOPACTIVITY.MOPID STRICT,
    TO_CHAR(MOPNOTES.MOPNOTEDATE, 
              'yyyy-mm-dd hh24:mi') "MOPNOTEDATE"
FROM MOPUSER.MOPACTIVITY
   INNER JOIN MOPUSER.MOPNOTES 
       ON MOPACTIVITY.MOPID=MOPNOTES.MOPID

尝试使用不同的关键字。

于 2013-06-07T19:00:58.293 回答