微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

带内部联接的select子查询的问题

如何解决带内部联接的select子查询的问题

以下查询是随后的jpql查询的转换。

本地查询

   SELECT t0.ID,t0.COMMENTS,t0.DATEIN,t0.GROUPNAME,t0.MEMBERID,t0.RECORDDATE,t0.GROUPTYPE,t1.ID,t1.COMMENTS,t1.DATEIN,t1.DATEOFFIN,t1.DATEOFFOUT,t1.DATEOUT,t1.GIVINGMEMBERID,t1.GIVINGH,t1.TEAMSUBGROUPID,t1.HOURS,t1.MEMBERID,t1.RECORDDATE,t1.STATUS,(SELECT COALESCE (SUM (t2.HOURS),?)
            FROM C##ERA.TEAMSUBGROUP    t7,C##ERA.MEMBERHASTEAM   t6,C##ERA.TIMESHAREDETAILS t5,C##ERA.PROCEsspERIOD   t4,C##ERA.FPURGE          t3,C##ERA.TIMESHAREDETAILS t2
           WHERE (    ((t5.FPURGEID = t3.ID) AND (t6.TEAMSUBGROUPID = t7.ID))
                  AND (    (    (t3.PERIODID = t4.FIPERIODID)
                            AND (t5.MEMBERID = t6.MEMBERID))
                       AND (t3.TEAMSUBGROUPID = t7.MEMBERID)))),CASE WHEN ((t1.STATUS = ?) OR (t1.STATUS = ?)) THEN ? ELSE ? END,(SELECT COALESCE (SUM (t8.HOURS),?)
            FROM C##ERA.HOURS t8
           WHERE (t8.MEMBERHASTEAMID = t1.ID)),(SELECT COALESCE (SUM (t9.HOURS),?)
            FROM C##ERA.HOURS t9
           WHERE (t9.HOURSOFMEMBERHASTEAMID = t1.ID)),CASE WHEN (t0.GROUPTYPE > ?) THEN ? ELSE ? END,CASE WHEN (t1.STATUS = ?) THEN ? ELSE ? END,(SELECT COALESCE (COUNT (t10.ID),?)
            FROM C##ERA.TEAMSUBGROUP t11,C##ERA.MEMBERHASTEAM t10
           WHERE (    (    ((t10.TEAMSUBGROUPID = ?) AND (t11.GROUPTYPE = ?))
                       AND (    ((t10.DATEIN >= ?) AND (t10.DATEIN <= ?))
                            AND ((t10.DATEOUT >= ?) AND (t10.DATEOUT <= ?))))
                  AND (t10.TEAMSUBGROUPID = t11.ID)))
    FROM C##ERA.TEAMSUBGROUP t0,C##ERA.MEMBERHASTEAM t1
   WHERE (    (    (t1.TEAMSUBGROUPID = ?)
               AND (    ((t1.DATEIN >= ?) AND (t1.DATEIN <= ?))
                    AND ((t1.DATEOUT >= ?) AND (t1.DATEOUT <= ?))))
          AND (t1.TEAMSUBGROUPID = t0.ID))
ORDER BY t1.DATEOUT

jpql查询

SELECT tg,g,(select COALESCE(sum(ts.hours),0) FROM TimesharedetailsEntity ts  
                            INNER JOIN FpurgeEntity fpurge ON ts.fpurgeid = fpurge.id  
                            INNER JOIN ProcessperiodEntity pp ON fpurge.periodid = pp.fiperiodid  
                            AND ts.memberid = g.memberid  
                            and fpurge.teamsubgroupid = tg.leader ) as kalypsi,(CASE WHEN (g.status= 1 OR g.status = 2) THEN 1 ELSE 0 END) as activeteam,(SELECT COALESCE(sum(hours.hours),0) FROM HoursEntity hours WHERE hours.teamid = g.id ) as wres,(SELECT COALESCE(sum(hoursadeia.hours),0) FROM HoursEntity hoursadeia WHERE hoursadeia.hoursoffteamid = g.id  ) as wresadeias,(CASE WHEN tg.type > 0 THEN 1 ELSE 0 END ) as isadeia,(CASE WHEN g.status=1 THEN 1 ELSE 0 END ) as isdatecalculation,(CASE WHEN g.status=2 THEN 1 ELSE 0 END ) as ishourcalculation,(SELECT COALESCE(COUNT(tstatus.id),0) FROM TeamEntity tstatus  
            INNER JOIN TeamgroupEntity tgstatus ON tstatus.groupid = tgstatus.id  
            WHERE tstatus.groupid = :groupid  
            AND tgstatus.type = 0  
            AND ( (tstatus.datein >= :periodStart AND tstatus.datein <= :periodStop)  
            AND (tstatus.dateout >= :periodStart AND tstatus.dateout <= :periodStop) ) ) as teamcount  
            FROM TeamEntity g  
            INNER JOIN TeamgroupEntity tg ON g.groupid = tg.id  
            WHERE g.groupid = :groupid  
            AND ( (g.datein >= :periodStart AND g.datein <= :periodStop)  
            AND (g.dateout >= :periodStart AND g.dateout <= :periodStop) )  
            ORDER BY g.dateout

问题是,第一个select查询无法正确转换。例如,jpql查询的子句AND ts.memberid = g.memberid(列ts.memberid来自内部查询g.memberid来自父查询)没有正确转换,并且之间的链接查询,内部查询丢失。但是,链接到父查询的所有列都将成为内部查询中的表。

有什么主意吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。