为什么在我的加入中重复

时间:2013-06-07 18:34:37

标签: sql oracle select join

为什么我会重复?看起来很简单,但它不是通过我厚厚的头骨。

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

答案 2 :(得分: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()over的使用使其成为一种分析功能。这是获得每个MOPID的最大值。 on子句只选择与最大值匹配的记录。

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

答案 3 :(得分: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

尝试使用 Distinct 关键字。